Merge
This commit is contained in:
commit
69633c6be2
jdk
make
src
java.base/share/classes
java
sun
security
util/cldr
java.desktop
macosx/classes/com/apple/laf
share
classes
com/sun
imageio/plugins/tiff
java/swing/plaf
media/sound
javax
imageio/plugins/tiff
swing
sun
native/libsplashscreen/libpng
unix/native/common/awt
windows/native/libawt/windows
jdk.incubator.httpclient/share/classes
test
ProblemList.txt
java
awt
Focus/FocusTraversalPolicy/ButtonGroupLayoutTraversal
FontClass
FontMetrics
font/JNICheck
lang/annotation
rmi
activation/Activatable/shutdownGracefully
reliability/benchmark/bench/rmi
server
UnicastRemoteObject/keepAliveDuringCall
Unreferenced/leaseCheckInterval
testlibrary
transport
util/Calendar
javax
net/ssl/SSLSession
rmi/PortableRemoteObject
swing/UIDefaults/8149879
sun
rmi/runtime/Log
security/util/Resources/customSysClassLoader
util/locale/provider
tools/jar/multiRelease
@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
@ -89,8 +89,8 @@ define CaptureLocale
|
||||
$1_NON_BASE_LOCALES := $$(subst zh-MO,zh-MO$$(SPACE)zh-Hant-MO, $$($1_NON_BASE_LOCALES))
|
||||
$1_NON_BASE_LOCALES := $$(subst zh-TW,zh-TW$$(SPACE)zh-Hant-TW, $$($1_NON_BASE_LOCALES))
|
||||
|
||||
# Adding implict locales nn-NO and nb-NO
|
||||
$1_NON_BASE_LOCALES += nn-NO nb-NO
|
||||
# Adding implict locales nb nn-NO and nb-NO
|
||||
$1_NON_BASE_LOCALES += nb nn-NO nb-NO
|
||||
$1_NON_BASE_LOCALES := $$(sort $$($1_NON_BASE_LOCALES))
|
||||
|
||||
ALL_BASE_LOCALES += $$($1_BASE_LOCALES)
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2012, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -389,6 +389,18 @@ class Bundle {
|
||||
}
|
||||
}
|
||||
}
|
||||
// replace empty era names with parentMap era names
|
||||
for (String key : ERA_KEYS) {
|
||||
Object value = myMap.get(key);
|
||||
if (value != null && value instanceof String[]) {
|
||||
String[] eraStrings = (String[]) value;
|
||||
for (String eraString : eraStrings) {
|
||||
if (eraString == null || eraString.isEmpty()) {
|
||||
fillInElements(parentsMap, key, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Remove all duplicates
|
||||
if (Objects.nonNull(parentsMap)) {
|
||||
|
71
jdk/make/src/classes/build/tools/taglet/Incubating.java
Normal file
71
jdk/make/src/classes/build/tools/taglet/Incubating.java
Normal file
@ -0,0 +1,71 @@
|
||||
/*
|
||||
* Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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 build.tools.taglet;
|
||||
|
||||
import java.util.EnumSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import com.sun.source.doctree.DocTree;
|
||||
import jdk.javadoc.doclet.taglet.Taglet;
|
||||
import static jdk.javadoc.doclet.taglet.Taglet.Location.*;
|
||||
|
||||
/**
|
||||
* An inline tag to conveniently insert a standard Incubating warning. For
|
||||
* use by members in Incubator Modules.
|
||||
*/
|
||||
public class Incubating implements Taglet {
|
||||
|
||||
/** Returns the set of locations in which a taglet may be used. */
|
||||
@Override
|
||||
public Set<Location> getAllowedLocations() {
|
||||
return EnumSet.of(OVERVIEW, MODULE, PACKAGE, TYPE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isInlineTag() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "Incubating";
|
||||
}
|
||||
|
||||
private static final String MESSAGE =
|
||||
"<BR><b><a href=\"http://openjdk.java.net/jeps/11\">Incubating Feature.</a>"
|
||||
+ " Will be removed in a future release.</b>";
|
||||
|
||||
@Override
|
||||
public String toString(DocTree tag) {
|
||||
return MESSAGE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString(List<? extends DocTree> tags) {
|
||||
return MESSAGE;
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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,16 +66,16 @@ import sun.security.util.SecurityConstants;
|
||||
* refer to a directory. Otherwise, the URL is assumed to refer to a JAR file
|
||||
* which will be opened as needed.
|
||||
* <p>
|
||||
* This class loader supports the loading of classes and resources from the
|
||||
* contents of a <a href="../util/jar/JarFile.html#multirelease">multi-release</a>
|
||||
* JAR file that is referred to by a given URL.
|
||||
* <p>
|
||||
* The AccessControlContext of the thread that created the instance of
|
||||
* URLClassLoader will be used when subsequently loading classes and
|
||||
* resources.
|
||||
* <p>
|
||||
* The classes that are loaded are by default granted permission only to
|
||||
* access the URLs specified when the URLClassLoader was created.
|
||||
* <p>
|
||||
* This class loader supports the loading of classes from the contents of a
|
||||
* <a href="../util/jar/JarFile.html#multirelease">multi-release</a> JAR file
|
||||
* that is referred to by a given URL.
|
||||
*
|
||||
* @author David Connelly
|
||||
* @since 1.2
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -71,7 +71,7 @@ import java.util.Objects;
|
||||
* following standard {@code AlgorithmParameterGenerator} algorithms and
|
||||
* keysizes in parentheses:
|
||||
* <ul>
|
||||
* <li>{@code DiffieHellman} (1024, 2048, 4096)</li>
|
||||
* <li>{@code DiffieHellman} (1024, 2048)</li>
|
||||
* <li>{@code DSA} (1024, 2048)</li>
|
||||
* </ul>
|
||||
* These algorithms are described in the <a href=
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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,7 +32,6 @@ import java.net.URL;
|
||||
import java.net.URI;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.*;
|
||||
import java.text.MessageFormat;
|
||||
import java.security.*;
|
||||
import java.security.cert.Certificate;
|
||||
import java.security.cert.X509Certificate;
|
||||
@ -579,10 +578,9 @@ public class PolicyFile extends java.security.Policy {
|
||||
k.add(policy);
|
||||
return k;
|
||||
});
|
||||
MessageFormat form = new MessageFormat(ResourcesMgr.getString
|
||||
(POLICY + ".error.parsing.policy.message"));
|
||||
Object[] source = {policy, pe.getLocalizedMessage()};
|
||||
System.err.println(form.format(source));
|
||||
System.err.println(LocalizedMessage.getMessage
|
||||
(POLICY + ".error.parsing.policy.message", source));
|
||||
if (debug != null) {
|
||||
pe.printStackTrace();
|
||||
}
|
||||
@ -805,32 +803,30 @@ public class PolicyFile extends java.security.Policy {
|
||||
}
|
||||
}
|
||||
} catch (java.lang.reflect.InvocationTargetException ite) {
|
||||
MessageFormat form = new MessageFormat
|
||||
(ResourcesMgr.getString
|
||||
(POLICY +
|
||||
".error.adding.Permission.perm.message"));
|
||||
Object[] source = {pe.permission,
|
||||
ite.getTargetException().toString()};
|
||||
System.err.println(form.format(source));
|
||||
System.err.println(
|
||||
LocalizedMessage.getMessage(
|
||||
POLICY + ".error.adding.Permission.perm.message",
|
||||
source));
|
||||
} catch (Exception e) {
|
||||
MessageFormat form = new MessageFormat
|
||||
(ResourcesMgr.getString
|
||||
(POLICY +
|
||||
".error.adding.Permission.perm.message"));
|
||||
Object[] source = {pe.permission,
|
||||
e.toString()};
|
||||
System.err.println(form.format(source));
|
||||
System.err.println(
|
||||
LocalizedMessage.getMessage(
|
||||
POLICY + ".error.adding.Permission.perm.message",
|
||||
source));
|
||||
}
|
||||
}
|
||||
|
||||
// No need to sync because noone has access to newInfo yet
|
||||
newInfo.policyEntries.add(entry);
|
||||
} catch (Exception e) {
|
||||
MessageFormat form = new MessageFormat(ResourcesMgr.getString
|
||||
(POLICY
|
||||
+ ".error.adding.Entry.message"));
|
||||
Object[] source = {e.toString()};
|
||||
System.err.println(form.format(source));
|
||||
System.err.println(
|
||||
LocalizedMessage.getMessage(
|
||||
POLICY + ".error.adding.Entry.message",
|
||||
source));
|
||||
}
|
||||
if (debug != null)
|
||||
debug.println();
|
||||
@ -1803,29 +1799,29 @@ public class PolicyFile extends java.security.Policy {
|
||||
} else if (prefix.equalsIgnoreCase("alias")) {
|
||||
// get the suffix and perform keystore alias replacement
|
||||
if (colonIndex == -1) {
|
||||
MessageFormat form = new MessageFormat
|
||||
(ResourcesMgr.getString
|
||||
("alias.name.not.provided.pe.name."));
|
||||
Object[] source = {pe.name};
|
||||
throw new Exception(form.format(source));
|
||||
throw new Exception(
|
||||
LocalizedMessage.getMessage(
|
||||
"alias.name.not.provided.pe.name.",
|
||||
source));
|
||||
}
|
||||
suffix = value.substring(colonIndex+1);
|
||||
if ((suffix = getDN(suffix, keystore)) == null) {
|
||||
MessageFormat form = new MessageFormat
|
||||
(ResourcesMgr.getString
|
||||
("unable.to.perform.substitution.on.alias.suffix"));
|
||||
Object[] source = {value.substring(colonIndex+1)};
|
||||
throw new Exception(form.format(source));
|
||||
throw new Exception(
|
||||
LocalizedMessage.getMessage(
|
||||
"unable.to.perform.substitution.on.alias.suffix",
|
||||
source));
|
||||
}
|
||||
|
||||
sb.append(X500PRINCIPAL + " \"" + suffix + "\"");
|
||||
startIndex = e+2;
|
||||
} else {
|
||||
MessageFormat form = new MessageFormat
|
||||
(ResourcesMgr.getString
|
||||
("substitution.value.prefix.unsupported"));
|
||||
Object[] source = {prefix};
|
||||
throw new Exception(form.format(source));
|
||||
throw new Exception(
|
||||
LocalizedMessage.getMessage(
|
||||
"substitution.value.prefix.unsupported",
|
||||
source));
|
||||
}
|
||||
}
|
||||
|
||||
@ -2039,7 +2035,7 @@ public class PolicyFile extends java.security.Policy {
|
||||
super(type);
|
||||
if (type == null) {
|
||||
throw new NullPointerException
|
||||
(ResourcesMgr.getString("type.can.t.be.null"));
|
||||
(LocalizedMessage.getMessage("type.can.t.be.null"));
|
||||
}
|
||||
this.type = type;
|
||||
this.name = name;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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,18 +26,14 @@
|
||||
package sun.security.provider;
|
||||
|
||||
import java.io.*;
|
||||
import java.lang.RuntimePermission;
|
||||
import java.net.SocketPermission;
|
||||
import java.net.URL;
|
||||
import java.security.GeneralSecurityException;
|
||||
import java.security.Principal;
|
||||
import java.text.MessageFormat;
|
||||
import java.util.*;
|
||||
import javax.security.auth.x500.X500Principal;
|
||||
|
||||
import sun.security.util.Debug;
|
||||
import sun.security.util.PropertyExpander;
|
||||
import sun.security.util.ResourcesMgr;
|
||||
import sun.security.util.LocalizedMessage;
|
||||
|
||||
/**
|
||||
* The policy for a Java runtime (specifying
|
||||
@ -209,13 +205,12 @@ public class PolicyParser {
|
||||
if (!domainEntries.containsKey(domainName)) {
|
||||
domainEntries.put(domainName, de);
|
||||
} else {
|
||||
MessageFormat form =
|
||||
new MessageFormat(ResourcesMgr.getString(
|
||||
"duplicate.keystore.domain.name"));
|
||||
LocalizedMessage localizedMsg =
|
||||
new LocalizedMessage("duplicate.keystore.domain.name");
|
||||
Object[] source = {domainName};
|
||||
String msg = "duplicate keystore domain name: " +
|
||||
domainName;
|
||||
throw new ParsingException(msg, form, source);
|
||||
throw new ParsingException(msg, localizedMsg, source);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
@ -225,7 +220,7 @@ public class PolicyParser {
|
||||
}
|
||||
|
||||
if (keyStoreUrlString == null && storePassURL != null) {
|
||||
throw new ParsingException(ResourcesMgr.getString
|
||||
throw new ParsingException(LocalizedMessage.getMessage
|
||||
("keystorePasswordURL.can.not.be.specified.without.also.specifying.keystore"));
|
||||
}
|
||||
}
|
||||
@ -367,7 +362,7 @@ public class PolicyParser {
|
||||
keyStoreType = match("quoted string");
|
||||
} else {
|
||||
throw new ParsingException(st.lineno(),
|
||||
ResourcesMgr.getString("expected.keystore.type"));
|
||||
LocalizedMessage.getMessage("expected.keystore.type"));
|
||||
}
|
||||
|
||||
// parse keystore provider
|
||||
@ -380,7 +375,7 @@ public class PolicyParser {
|
||||
keyStoreProvider = match("quoted string");
|
||||
} else {
|
||||
throw new ParsingException(st.lineno(),
|
||||
ResourcesMgr.getString("expected.keystore.provider"));
|
||||
LocalizedMessage.getMessage("expected.keystore.provider"));
|
||||
}
|
||||
}
|
||||
|
||||
@ -430,7 +425,7 @@ public class PolicyParser {
|
||||
if (e.codeBase != null)
|
||||
throw new ParsingException(
|
||||
st.lineno(),
|
||||
ResourcesMgr.getString
|
||||
LocalizedMessage.getMessage
|
||||
("multiple.Codebase.expressions"));
|
||||
e.codeBase = match("quoted string");
|
||||
peekAndMatch(",");
|
||||
@ -438,8 +433,8 @@ public class PolicyParser {
|
||||
if (e.signedBy != null)
|
||||
throw new ParsingException(
|
||||
st.lineno(),
|
||||
ResourcesMgr.getString(
|
||||
"multiple.SignedBy.expressions"));
|
||||
LocalizedMessage.getMessage
|
||||
("multiple.SignedBy.expressions"));
|
||||
e.signedBy = match("quoted string");
|
||||
|
||||
// verify syntax of the aliases
|
||||
@ -457,8 +452,8 @@ public class PolicyParser {
|
||||
if (actr <= cctr)
|
||||
throw new ParsingException(
|
||||
st.lineno(),
|
||||
ResourcesMgr.getString(
|
||||
"SignedBy.has.empty.alias"));
|
||||
LocalizedMessage.getMessage
|
||||
("SignedBy.has.empty.alias"));
|
||||
|
||||
peekAndMatch(",");
|
||||
} else if (peekAndMatch("Principal")) {
|
||||
@ -500,7 +495,7 @@ public class PolicyParser {
|
||||
}
|
||||
throw new ParsingException
|
||||
(st.lineno(),
|
||||
ResourcesMgr.getString
|
||||
LocalizedMessage.getMessage
|
||||
("can.not.specify.Principal.with.a.wildcard.class.without.a.wildcard.name"));
|
||||
}
|
||||
}
|
||||
@ -537,8 +532,8 @@ public class PolicyParser {
|
||||
|
||||
} else {
|
||||
throw new ParsingException(st.lineno(),
|
||||
ResourcesMgr.getString(
|
||||
"expected.codeBase.or.SignedBy.or.Principal"));
|
||||
LocalizedMessage.getMessage
|
||||
("expected.codeBase.or.SignedBy.or.Principal"));
|
||||
}
|
||||
}
|
||||
|
||||
@ -561,8 +556,8 @@ public class PolicyParser {
|
||||
} else {
|
||||
throw new
|
||||
ParsingException(st.lineno(),
|
||||
ResourcesMgr.getString(
|
||||
"expected.permission.entry"));
|
||||
LocalizedMessage.getMessage
|
||||
("expected.permission.entry"));
|
||||
}
|
||||
}
|
||||
match("}");
|
||||
@ -738,15 +733,14 @@ public class PolicyParser {
|
||||
switch (lookahead) {
|
||||
case StreamTokenizer.TT_NUMBER:
|
||||
throw new ParsingException(st.lineno(), expect,
|
||||
ResourcesMgr.getString("number.") +
|
||||
String.valueOf(st.nval));
|
||||
LocalizedMessage.getMessage("number.") +
|
||||
String.valueOf(st.nval));
|
||||
case StreamTokenizer.TT_EOF:
|
||||
MessageFormat form = new MessageFormat(
|
||||
ResourcesMgr.getString
|
||||
("expected.expect.read.end.of.file."));
|
||||
LocalizedMessage localizedMsg = new LocalizedMessage
|
||||
("expected.expect.read.end.of.file.");
|
||||
Object[] source = {expect};
|
||||
String msg = "expected [" + expect + "], read [end of file]";
|
||||
throw new ParsingException(msg, form, source);
|
||||
throw new ParsingException(msg, localizedMsg, source);
|
||||
case StreamTokenizer.TT_WORD:
|
||||
if (expect.equalsIgnoreCase(st.sval)) {
|
||||
lookahead = st.nextToken();
|
||||
@ -832,10 +826,10 @@ public class PolicyParser {
|
||||
switch (lookahead) {
|
||||
case StreamTokenizer.TT_NUMBER:
|
||||
throw new ParsingException(st.lineno(), ";",
|
||||
ResourcesMgr.getString("number.") +
|
||||
String.valueOf(st.nval));
|
||||
LocalizedMessage.getMessage("number.") +
|
||||
String.valueOf(st.nval));
|
||||
case StreamTokenizer.TT_EOF:
|
||||
throw new ParsingException(ResourcesMgr.getString
|
||||
throw new ParsingException(LocalizedMessage.getMessage
|
||||
("expected.read.end.of.file."));
|
||||
default:
|
||||
lookahead = st.nextToken();
|
||||
@ -993,8 +987,8 @@ public class PolicyParser {
|
||||
*/
|
||||
public PrincipalEntry(String principalClass, String principalName) {
|
||||
if (principalClass == null || principalName == null)
|
||||
throw new NullPointerException(ResourcesMgr.getString(
|
||||
"null.principalClass.or.principalName"));
|
||||
throw new NullPointerException(LocalizedMessage.getMessage
|
||||
("null.principalClass.or.principalName"));
|
||||
this.principalClass = principalClass;
|
||||
this.principalName = principalName;
|
||||
}
|
||||
@ -1244,11 +1238,11 @@ public class PolicyParser {
|
||||
if (!entries.containsKey(keystoreName)) {
|
||||
entries.put(keystoreName, entry);
|
||||
} else {
|
||||
MessageFormat form = new MessageFormat(ResourcesMgr.getString(
|
||||
"duplicate.keystore.name"));
|
||||
LocalizedMessage localizedMsg = new LocalizedMessage
|
||||
("duplicate.keystore.name");
|
||||
Object[] source = {keystoreName};
|
||||
String msg = "duplicate keystore name: " + keystoreName;
|
||||
throw new ParsingException(msg, form, source);
|
||||
throw new ParsingException(msg, localizedMsg, source);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1320,7 +1314,7 @@ public class PolicyParser {
|
||||
private static final long serialVersionUID = -4330692689482574072L;
|
||||
|
||||
private String i18nMessage;
|
||||
private MessageFormat form;
|
||||
private LocalizedMessage localizedMsg;
|
||||
private Object[] source;
|
||||
|
||||
/**
|
||||
@ -1336,10 +1330,10 @@ public class PolicyParser {
|
||||
i18nMessage = msg;
|
||||
}
|
||||
|
||||
public ParsingException(String msg, MessageFormat form,
|
||||
public ParsingException(String msg, LocalizedMessage localizedMsg,
|
||||
Object[] source) {
|
||||
super(msg);
|
||||
this.form = form;
|
||||
this.localizedMsg = localizedMsg;
|
||||
this.source = source;
|
||||
}
|
||||
|
||||
@ -1347,7 +1341,7 @@ public class PolicyParser {
|
||||
super("line " + line + ": " + msg);
|
||||
// don't call form.format unless getLocalizedMessage is called
|
||||
// to avoid unnecessary permission checks
|
||||
form = new MessageFormat(ResourcesMgr.getString("line.number.msg"));
|
||||
localizedMsg = new LocalizedMessage("line.number.msg");
|
||||
source = new Object[] {line, msg};
|
||||
}
|
||||
|
||||
@ -1356,14 +1350,14 @@ public class PolicyParser {
|
||||
"], found [" + actual + "]");
|
||||
// don't call form.format unless getLocalizedMessage is called
|
||||
// to avoid unnecessary permission checks
|
||||
form = new MessageFormat(ResourcesMgr.getString
|
||||
("line.number.expected.expect.found.actual."));
|
||||
localizedMsg = new LocalizedMessage
|
||||
("line.number.expected.expect.found.actual.");
|
||||
source = new Object[] {line, expect, actual};
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getLocalizedMessage() {
|
||||
return i18nMessage != null ? i18nMessage : form.format(source);
|
||||
return i18nMessage != null ? i18nMessage : localizedMsg.format(source);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -0,0 +1,151 @@
|
||||
/*
|
||||
* Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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.security.util;
|
||||
|
||||
/**
|
||||
* This class produces formatted and localized messages describing security
|
||||
* issues. Some messages may be required when the VM is not fully booted. In
|
||||
* this case, localization resources and classes used for message formatting
|
||||
* may not be available. When the VM is not booted, the message will not be
|
||||
* localized, and it will be formatted using simplified message formatting
|
||||
* code that is contained in this class.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Some of this code is executed before the VM is fully booted. Some import
|
||||
* statements have been omitted to help prevent accidental use of classes that
|
||||
* may not be available during boot.
|
||||
*/
|
||||
|
||||
public class LocalizedMessage {
|
||||
|
||||
private static final Resources resources = new Resources();
|
||||
|
||||
private final String key;
|
||||
|
||||
/**
|
||||
* A LocalizedMessage can be instantiated with a key and formatted with
|
||||
* arguments later in the style of MessageFormat. This organization
|
||||
* allows the actual formatting (and associated permission checks) to be
|
||||
* avoided unless the resulting string is needed.
|
||||
* @param key
|
||||
*/
|
||||
public LocalizedMessage(String key) {
|
||||
this.key = key;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return a localized string corresponding to the key stored in this
|
||||
* object, formatted with the provided arguments. When the VM is booted,
|
||||
* this method will obtain the correct localized message and format it
|
||||
* using java.text.MessageFormat. Otherwise, a non-localized string is
|
||||
* returned, and the formatting is performed by simplified formatting code.
|
||||
*
|
||||
* @param arguments The arguments that should be placed in the message
|
||||
* @return A formatted message string
|
||||
*/
|
||||
public String format(Object... arguments) {
|
||||
return getMessage(key, arguments);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return a non-localized string corresponding to the provided key, and
|
||||
* formatted with the provided arguments. All strings are obtained from
|
||||
* sun.security.util.Resources, and the formatting only supports
|
||||
* simple positional argument replacement (e.g. {1}).
|
||||
*
|
||||
* @param key The key of the desired string in Resources
|
||||
* @param arguments The arguments that should be placed in the message
|
||||
* @return A formatted message string
|
||||
*/
|
||||
public static String getMessageUnbooted(String key,
|
||||
Object... arguments) {
|
||||
|
||||
String value = resources.getString(key);
|
||||
if (arguments == null || arguments.length == 0) {
|
||||
return value;
|
||||
}
|
||||
// Classes like StringTokenizer may not be loaded, so parsing
|
||||
// is performed with String methods
|
||||
StringBuilder sb = new StringBuilder();
|
||||
int nextBraceIndex;
|
||||
while ((nextBraceIndex = value.indexOf('{')) >= 0) {
|
||||
|
||||
String firstPart = value.substring(0, nextBraceIndex);
|
||||
sb.append(firstPart);
|
||||
value = value.substring(nextBraceIndex + 1);
|
||||
|
||||
// look for closing brace and argument index
|
||||
nextBraceIndex = value.indexOf('}');
|
||||
if (nextBraceIndex < 0) {
|
||||
// no closing brace
|
||||
// MessageFormat would throw IllegalArgumentException, but
|
||||
// that exception class may not be loaded yet
|
||||
throw new RuntimeException("Unmatched braces");
|
||||
}
|
||||
String indexStr = value.substring(0, nextBraceIndex);
|
||||
try {
|
||||
int index = Integer.parseInt(indexStr);
|
||||
sb.append(arguments[index]);
|
||||
}
|
||||
catch(NumberFormatException e) {
|
||||
// argument index is not an integer
|
||||
throw new RuntimeException("not an integer: " + indexStr);
|
||||
}
|
||||
value = value.substring(nextBraceIndex + 1);
|
||||
}
|
||||
sb.append(value);
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Return a localized string corresponding to the provided key, and
|
||||
* formatted with the provided arguments. When the VM is booted, this
|
||||
* method will obtain the correct localized message and format it using
|
||||
* java.text.MessageFormat. Otherwise, a non-localized string is returned,
|
||||
* and the formatting is performed by simplified formatting code.
|
||||
*
|
||||
* @param key The key of the desired string in the security resource bundle
|
||||
* @param arguments The arguments that should be placed in the message
|
||||
* @return A formatted message string
|
||||
*/
|
||||
public static String getMessage(String key,
|
||||
Object... arguments) {
|
||||
|
||||
if (jdk.internal.misc.VM.isBooted()) {
|
||||
// Localization and formatting resources are available
|
||||
String value = ResourcesMgr.getString(key);
|
||||
if (arguments == null) {
|
||||
return value;
|
||||
}
|
||||
java.text.MessageFormat form = new java.text.MessageFormat(value);
|
||||
return form.format(arguments);
|
||||
} else {
|
||||
return getMessageUnbooted(key, arguments);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2000, 2006, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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,37 +34,24 @@ import jdk.internal.misc.VM;
|
||||
*/
|
||||
public class ResourcesMgr {
|
||||
// intended for java.security, javax.security and sun.security resources
|
||||
private final static String RESOURCES = "sun.security.util.Resources";
|
||||
private final static String AUTH_RESOURCES = "sun.security.util.AuthResources";
|
||||
|
||||
private final static Map<String, ResourceBundle> bundles = new ConcurrentHashMap<>();
|
||||
|
||||
public static String getString(String s) {
|
||||
ResourceBundle bundle = bundles.get(RESOURCES);
|
||||
if (bundle == null) {
|
||||
|
||||
// only load if/when needed
|
||||
bundle = java.security.AccessController.doPrivileged(
|
||||
new java.security.PrivilegedAction<java.util.ResourceBundle>() {
|
||||
public java.util.ResourceBundle run() {
|
||||
return (java.util.ResourceBundle.getBundle
|
||||
("sun.security.util.Resources"));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
return bundle.getString(s);
|
||||
return getBundle("sun.security.util.Resources").getString(s);
|
||||
}
|
||||
|
||||
public static String getAuthResourceString(String s) {
|
||||
if (VM.initLevel() == 3) {
|
||||
// cannot trigger loading of any resource bundle as
|
||||
// it depends on the system class loader fully initialized.
|
||||
throw new InternalError("system class loader is being initialized");
|
||||
}
|
||||
return getBundle("sun.security.util.AuthResources").getString(s);
|
||||
}
|
||||
|
||||
return bundles.computeIfAbsent(AUTH_RESOURCES, ResourceBundle::getBundle)
|
||||
.getString(s);
|
||||
private static ResourceBundle getBundle(String bundleName) {
|
||||
if (!VM.isBooted()) {
|
||||
// don't expect this be called before the system is fully initialized.
|
||||
// This triggers loading of any resource bundle that should be
|
||||
// be done during initialization of system class loader.
|
||||
throw new InternalError("Expected to use ResourceBundle only after booted");
|
||||
}
|
||||
return bundles.computeIfAbsent(bundleName, ResourceBundle::getBundle);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2012, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -195,9 +195,26 @@ public class CLDRLocaleProviderAdapter extends JRELocaleProviderAdapter {
|
||||
return parent;
|
||||
}
|
||||
|
||||
/**
|
||||
* This method returns equivalent CLDR supported locale for zh-HK,
|
||||
* no, no-NO locales so that COMPAT locales do not precede
|
||||
* those locales during ResourceBundle search path.
|
||||
*/
|
||||
private static Locale getEquivalentLoc(Locale locale) {
|
||||
switch (locale.toString()) {
|
||||
case "zh_HK":
|
||||
return Locale.forLanguageTag("zh-Hant-HK");
|
||||
case "no":
|
||||
case "no_NO":
|
||||
return Locale.forLanguageTag("nb");
|
||||
}
|
||||
return locale;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSupportedProviderLocale(Locale locale, Set<String> langtags) {
|
||||
return Locale.ROOT.equals(locale) ||
|
||||
langtags.contains(locale.stripExtensions().toLanguageTag());
|
||||
return Locale.ROOT.equals(locale)
|
||||
|| langtags.contains(locale.stripExtensions().toLanguageTag())
|
||||
|| langtags.contains(getEquivalentLoc(locale).toLanguageTag());
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -248,7 +248,8 @@ public class AquaLookAndFeel extends BasicLookAndFeel {
|
||||
*/
|
||||
private void initResourceBundle(final UIDefaults table) {
|
||||
table.setDefaultLocale(Locale.getDefault());
|
||||
table.addResourceBundle(PKG_PREFIX + "resources.aqua");
|
||||
SwingAccessor.getUIDefaultsAccessor().addInternalBundle(table,
|
||||
PKG_PREFIX + "resources.aqua");
|
||||
try {
|
||||
final ResourceBundle aquaProperties = ResourceBundle.getBundle(PKG_PREFIX + "resources.aqua");
|
||||
final Enumeration<String> propertyKeys = aquaProperties.getKeys();
|
||||
|
@ -155,6 +155,11 @@ public abstract class TIFFDecompressor {
|
||||
*/
|
||||
protected boolean planar;
|
||||
|
||||
/**
|
||||
* The planar band to decode; ignored for chunky (interleaved) images.
|
||||
*/
|
||||
protected int planarBand = 0;
|
||||
|
||||
/**
|
||||
* The value of the {@code SamplesPerPixel} tag.
|
||||
*/
|
||||
@ -446,24 +451,19 @@ public abstract class TIFFDecompressor {
|
||||
* Create a {@code ComponentColorModel} for use in creating
|
||||
* an {@code ImageTypeSpecifier}.
|
||||
*/
|
||||
// This code was copied from javax.imageio.ImageTypeSpecifier.
|
||||
// This code was inspired by the method of the same name in
|
||||
// javax.imageio.ImageTypeSpecifier
|
||||
static ColorModel createComponentCM(ColorSpace colorSpace,
|
||||
int numBands,
|
||||
int[] bitsPerSample,
|
||||
int dataType,
|
||||
boolean hasAlpha,
|
||||
boolean isAlphaPremultiplied) {
|
||||
int transparency =
|
||||
hasAlpha ? Transparency.TRANSLUCENT : Transparency.OPAQUE;
|
||||
|
||||
int[] numBits = new int[numBands];
|
||||
int bits = DataBuffer.getDataTypeSize(dataType);
|
||||
|
||||
for (int i = 0; i < numBands; i++) {
|
||||
numBits[i] = bits;
|
||||
}
|
||||
|
||||
return new ComponentColorModel(colorSpace,
|
||||
numBits,
|
||||
bitsPerSample,
|
||||
hasAlpha,
|
||||
isAlphaPremultiplied,
|
||||
transparency,
|
||||
@ -581,14 +581,15 @@ public abstract class TIFFDecompressor {
|
||||
* Determines whether the {@code DataBuffer} is filled without
|
||||
* any interspersed padding bits.
|
||||
*/
|
||||
private static boolean isDataBufferBitContiguous(SampleModel sm)
|
||||
private static boolean isDataBufferBitContiguous(SampleModel sm,
|
||||
int[] bitsPerSample)
|
||||
throws IIOException {
|
||||
int dataTypeSize = getDataTypeSize(sm.getDataType());
|
||||
|
||||
if(sm instanceof ComponentSampleModel) {
|
||||
int numBands = sm.getNumBands();
|
||||
for(int i = 0; i < numBands; i++) {
|
||||
if(sm.getSampleSize(i) != dataTypeSize) {
|
||||
if(bitsPerSample[i] != dataTypeSize) {
|
||||
// Sample does not fill data element.
|
||||
return false;
|
||||
}
|
||||
@ -682,6 +683,7 @@ public abstract class TIFFDecompressor {
|
||||
* of the supplied {@code WritableRaster}.
|
||||
*/
|
||||
private static void reformatDiscontiguousData(byte[] buf,
|
||||
int[] bitsPerSample,
|
||||
int stride,
|
||||
int w,
|
||||
int h,
|
||||
@ -691,7 +693,6 @@ public abstract class TIFFDecompressor {
|
||||
// Get SampleModel info.
|
||||
SampleModel sm = raster.getSampleModel();
|
||||
int numBands = sm.getNumBands();
|
||||
int[] sampleSize = sm.getSampleSize();
|
||||
|
||||
// Initialize input stream.
|
||||
ByteArrayInputStream is = new ByteArrayInputStream(buf);
|
||||
@ -705,7 +706,7 @@ public abstract class TIFFDecompressor {
|
||||
int x = raster.getMinX();
|
||||
for(int i = 0; i < w; i++, x++) {
|
||||
for(int b = 0; b < numBands; b++) {
|
||||
long bits = iis.readBits(sampleSize[b]);
|
||||
long bits = iis.readBits(bitsPerSample[b]);
|
||||
raster.setSample(x, y, b, (int)bits);
|
||||
}
|
||||
}
|
||||
@ -806,8 +807,15 @@ public abstract class TIFFDecompressor {
|
||||
blueLut[i] = (byte)((colorMap[2*mapSize + i]*255)/65535);
|
||||
}
|
||||
|
||||
int dataType = bitsPerSample[0] == 8 ?
|
||||
DataBuffer.TYPE_BYTE : DataBuffer.TYPE_USHORT;
|
||||
int dataType;
|
||||
if (bitsPerSample[0] <= 8) {
|
||||
dataType = DataBuffer.TYPE_BYTE;
|
||||
} else if (sampleFormat[0] ==
|
||||
BaselineTIFFTagSet.SAMPLE_FORMAT_SIGNED_INTEGER) {
|
||||
dataType = DataBuffer.TYPE_SHORT;
|
||||
} else {
|
||||
dataType = DataBuffer.TYPE_USHORT;
|
||||
}
|
||||
return ImageTypeSpecifier.createIndexed(redLut,
|
||||
greenLut,
|
||||
blueLut,
|
||||
@ -1082,6 +1090,7 @@ public abstract class TIFFDecompressor {
|
||||
|
||||
cm = createComponentCM(cs,
|
||||
samplesPerPixel,
|
||||
bitsPerSample,
|
||||
dataType,
|
||||
hasAlpha,
|
||||
alphaPremultiplied);
|
||||
@ -1089,6 +1098,7 @@ public abstract class TIFFDecompressor {
|
||||
ColorSpace cs = new BogusColorSpace(samplesPerPixel);
|
||||
cm = createComponentCM(cs,
|
||||
samplesPerPixel,
|
||||
bitsPerSample,
|
||||
dataType,
|
||||
false, // hasAlpha
|
||||
false); // alphaPremultiplied
|
||||
@ -1119,17 +1129,23 @@ public abstract class TIFFDecompressor {
|
||||
BaselineTIFFTagSet.SAMPLE_FORMAT_SIGNED_INTEGER);
|
||||
|
||||
// Grayscale
|
||||
if(samplesPerPixel == 1) {
|
||||
int dataType =
|
||||
getDataTypeFromNumBits(maxBitsPerSample, isSigned);
|
||||
if(samplesPerPixel == 1 &&
|
||||
(bitsPerSample[0] == 1 || bitsPerSample[0] == 2 ||
|
||||
bitsPerSample[0] == 4 || bitsPerSample[0] == 8 ||
|
||||
bitsPerSample[0] == 16)) {
|
||||
int dataType = getDataTypeFromNumBits(maxBitsPerSample, isSigned);
|
||||
|
||||
return ImageTypeSpecifier.createGrayscale(maxBitsPerSample,
|
||||
return ImageTypeSpecifier.createGrayscale(bitsPerSample[0],
|
||||
dataType,
|
||||
isSigned);
|
||||
}
|
||||
|
||||
// Gray-alpha
|
||||
if (samplesPerPixel == 2) {
|
||||
if (samplesPerPixel == 2 &&
|
||||
bitsPerSample[0] == bitsPerSample[1] &&
|
||||
(bitsPerSample[0] == 1 || bitsPerSample[0] == 2 ||
|
||||
bitsPerSample[0] == 4 || bitsPerSample[0] == 8 ||
|
||||
bitsPerSample[0] == 16)) {
|
||||
boolean alphaPremultiplied = false;
|
||||
if (extraSamples != null &&
|
||||
extraSamples[0] ==
|
||||
@ -1147,6 +1163,13 @@ public abstract class TIFFDecompressor {
|
||||
}
|
||||
|
||||
if (samplesPerPixel == 3 || samplesPerPixel == 4) {
|
||||
int dataType = getDataTypeFromNumBits(maxBitsPerSample, isSigned);
|
||||
int dataTypeSize;
|
||||
try {
|
||||
dataTypeSize = getDataTypeSize(dataType);
|
||||
} catch (IIOException ignored) {
|
||||
dataTypeSize = maxBitsPerSample;
|
||||
}
|
||||
if(totalBits <= 32 && !isSigned) {
|
||||
// Packed RGB or RGBA
|
||||
int redMask = createMask(bitsPerSample, 0);
|
||||
@ -1169,21 +1192,24 @@ public abstract class TIFFDecompressor {
|
||||
alphaMask,
|
||||
transferType,
|
||||
alphaPremultiplied);
|
||||
} else if(samplesPerPixel == 3) {
|
||||
} else if(samplesPerPixel == 3 &&
|
||||
dataTypeSize == bitsPerSample[0] &&
|
||||
bitsPerSample[0] == bitsPerSample[1] &&
|
||||
bitsPerSample[1] == bitsPerSample[2]) {
|
||||
// Interleaved RGB
|
||||
int[] bandOffsets = new int[] {0, 1, 2};
|
||||
int dataType =
|
||||
getDataTypeFromNumBits(maxBitsPerSample, isSigned);
|
||||
return ImageTypeSpecifier.createInterleaved(rgb,
|
||||
bandOffsets,
|
||||
dataType,
|
||||
false,
|
||||
false);
|
||||
} else if(samplesPerPixel == 4) {
|
||||
} else if(samplesPerPixel == 4 &&
|
||||
dataTypeSize == bitsPerSample[0] &&
|
||||
bitsPerSample[0] == bitsPerSample[1] &&
|
||||
bitsPerSample[1] == bitsPerSample[2] &&
|
||||
bitsPerSample[2] == bitsPerSample[3]) {
|
||||
// Interleaved RGBA
|
||||
int[] bandOffsets = new int[] {0, 1, 2, 3};
|
||||
int dataType =
|
||||
getDataTypeFromNumBits(maxBitsPerSample, isSigned);
|
||||
boolean alphaPremultiplied = false;
|
||||
if (extraSamples != null &&
|
||||
extraSamples[0] ==
|
||||
@ -1196,20 +1222,28 @@ public abstract class TIFFDecompressor {
|
||||
true,
|
||||
alphaPremultiplied);
|
||||
}
|
||||
} else {
|
||||
// Arbitrary Interleaved.
|
||||
int dataType =
|
||||
getDataTypeFromNumBits(maxBitsPerSample, isSigned);
|
||||
SampleModel sm = createInterleavedSM(dataType,
|
||||
samplesPerPixel);
|
||||
ColorSpace cs = new BogusColorSpace(samplesPerPixel);
|
||||
ColorModel cm = createComponentCM(cs,
|
||||
samplesPerPixel,
|
||||
dataType,
|
||||
false, // hasAlpha
|
||||
false); // alphaPremultiplied
|
||||
return new ImageTypeSpecifier(cm, sm);
|
||||
}
|
||||
|
||||
// Arbitrary Interleaved.
|
||||
int dataType =
|
||||
getDataTypeFromNumBits(maxBitsPerSample, isSigned);
|
||||
SampleModel sm = createInterleavedSM(dataType,
|
||||
samplesPerPixel);
|
||||
ColorSpace cs;
|
||||
if (samplesPerPixel <= 2) {
|
||||
cs = ColorSpace.getInstance(ColorSpace.CS_GRAY);
|
||||
} else if (samplesPerPixel <= 4) {
|
||||
cs = rgb;
|
||||
} else {
|
||||
cs = new BogusColorSpace(samplesPerPixel);
|
||||
}
|
||||
ColorModel cm = createComponentCM(cs,
|
||||
samplesPerPixel,
|
||||
bitsPerSample,
|
||||
dataType,
|
||||
false, // hasAlpha
|
||||
false); // alphaPremultiplied
|
||||
return new ImageTypeSpecifier(cm, sm);
|
||||
}
|
||||
|
||||
return null;
|
||||
@ -1284,6 +1318,14 @@ public abstract class TIFFDecompressor {
|
||||
this.planar = planar;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the index of the planar configuration band to be decoded. This value
|
||||
* is ignored for chunky (interleaved) images.
|
||||
*
|
||||
* @param the index of the planar band to decode
|
||||
*/
|
||||
public void setPlanarBand(int planarBand) { this.planarBand = planarBand; }
|
||||
|
||||
/**
|
||||
* Sets the value of the {@code samplesPerPixel} field.
|
||||
*
|
||||
@ -2488,7 +2530,7 @@ public abstract class TIFFDecompressor {
|
||||
// Branch based on whether data are bit-contiguous, i.e.,
|
||||
// data are packaed as tightly as possible leaving no unused
|
||||
// bits except at the end of a row.
|
||||
if(isDataBufferBitContiguous(sm)) {
|
||||
if(isDataBufferBitContiguous(sm, bitsPerSample)) {
|
||||
// Use byte or float data directly.
|
||||
if (byteData != null) {
|
||||
decodeRaw(byteData, dstOffset,
|
||||
@ -2537,11 +2579,19 @@ public abstract class TIFFDecompressor {
|
||||
} else {
|
||||
// Read discontiguous data into bytes and set the samples
|
||||
// into the Raster.
|
||||
int bpp = getBitsPerPixel(sm);
|
||||
int bpp;
|
||||
if (planar) {
|
||||
bpp = bitsPerSample[planarBand];
|
||||
} else {
|
||||
bpp = 0;
|
||||
for (int bps : bitsPerSample) {
|
||||
bpp += bps;
|
||||
}
|
||||
}
|
||||
int bytesPerRow = (bpp*srcWidth + 7)/8;
|
||||
byte[] buf = new byte[bytesPerRow*srcHeight];
|
||||
decodeRaw(buf, 0, bpp, bytesPerRow);
|
||||
reformatDiscontiguousData(buf, bytesPerRow,
|
||||
reformatDiscontiguousData(buf, bitsPerSample, bytesPerRow,
|
||||
srcWidth, srcHeight,
|
||||
ras);
|
||||
}
|
||||
|
@ -413,6 +413,133 @@ public class TIFFIFD extends TIFFDirectory {
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Retrieve the value of a baseline field as a long.
|
||||
//
|
||||
private long getFieldAsLong(int tagNumber) {
|
||||
TIFFField f = getTIFFField(tagNumber);
|
||||
return f == null ? -1 : f.getAsLong(0);
|
||||
}
|
||||
|
||||
//
|
||||
// Retrieve the value of a baseline field as an int.
|
||||
//
|
||||
private int getFieldAsInt(int tagNumber) {
|
||||
TIFFField f = getTIFFField(tagNumber);
|
||||
return f == null ? -1 : f.getAsInt(0);
|
||||
}
|
||||
|
||||
//
|
||||
// Calculate the number of bytes in each strip or tile. This method
|
||||
// is to be used if and only if no fields exist which provide this
|
||||
// information. The parameter must be empty and if the method succeeds
|
||||
// will contain a single element.
|
||||
//
|
||||
private boolean calculateByteCounts(int expectedSize,
|
||||
List<TIFFField> byteCounts) {
|
||||
if (!byteCounts.isEmpty()) {
|
||||
throw new IllegalArgumentException("byteCounts is not empty");
|
||||
}
|
||||
|
||||
// must be interleaved
|
||||
if (getFieldAsInt(BaselineTIFFTagSet.TAG_PLANAR_CONFIGURATION) ==
|
||||
BaselineTIFFTagSet.PLANAR_CONFIGURATION_PLANAR) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// must be uncompressed
|
||||
if (getFieldAsInt(BaselineTIFFTagSet.TAG_COMPRESSION) !=
|
||||
BaselineTIFFTagSet.COMPRESSION_NONE) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// must have image dimensions
|
||||
long w = getFieldAsLong(BaselineTIFFTagSet.TAG_IMAGE_WIDTH);
|
||||
if (w < 0) {
|
||||
return false;
|
||||
}
|
||||
long h = getFieldAsLong(BaselineTIFFTagSet.TAG_IMAGE_LENGTH);
|
||||
if (h < 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
long tw = getFieldAsLong(BaselineTIFFTagSet.TAG_TILE_WIDTH);
|
||||
if (tw < 0) {
|
||||
tw = w;
|
||||
}
|
||||
long th = getFieldAsLong(BaselineTIFFTagSet.TAG_TILE_LENGTH);
|
||||
if (th < 0) {
|
||||
th = getFieldAsLong(BaselineTIFFTagSet.TAG_ROWS_PER_STRIP);
|
||||
if (th < 0) {
|
||||
th = h;
|
||||
}
|
||||
}
|
||||
|
||||
int[] bitsPerSample = null;
|
||||
TIFFField f = getTIFFField(BaselineTIFFTagSet.TAG_BITS_PER_SAMPLE);
|
||||
if (f != null) {
|
||||
bitsPerSample = f.getAsInts();
|
||||
} else {
|
||||
int samplesPerPixel =
|
||||
getFieldAsInt(BaselineTIFFTagSet.TAG_SAMPLES_PER_PIXEL);
|
||||
if (samplesPerPixel < 0) {
|
||||
samplesPerPixel = 1;
|
||||
}
|
||||
bitsPerSample = new int[samplesPerPixel];
|
||||
Arrays.fill(bitsPerSample, 8);
|
||||
}
|
||||
|
||||
int bitsPerPixel = 0;
|
||||
for (int bps : bitsPerSample) {
|
||||
bitsPerPixel += bps;
|
||||
}
|
||||
|
||||
int bytesPerRow = (int)(tw*bitsPerPixel + 7)/8;
|
||||
int bytesPerPacket = (int)th*bytesPerRow;
|
||||
|
||||
long nx = (w + tw - 1)/tw;
|
||||
long ny = (h + th - 1)/th;
|
||||
|
||||
if (nx*ny != expectedSize) {
|
||||
return false;
|
||||
}
|
||||
|
||||
boolean isTiled =
|
||||
getTIFFField(BaselineTIFFTagSet.TAG_TILE_BYTE_COUNTS) != null;
|
||||
|
||||
int tagNumber;
|
||||
if (isTiled) {
|
||||
tagNumber = BaselineTIFFTagSet.TAG_TILE_BYTE_COUNTS;
|
||||
} else {
|
||||
tagNumber = BaselineTIFFTagSet.TAG_STRIP_BYTE_COUNTS;
|
||||
}
|
||||
|
||||
TIFFTag t = BaselineTIFFTagSet.getInstance().getTag(tagNumber);
|
||||
f = getTIFFField(tagNumber);
|
||||
if (f != null) {
|
||||
removeTIFFField(tagNumber);
|
||||
}
|
||||
|
||||
int numPackets = (int)(nx*ny);
|
||||
long[] packetByteCounts = new long[numPackets];
|
||||
Arrays.fill(packetByteCounts, bytesPerPacket);
|
||||
|
||||
// if the strip or tile width does not exceed the image width and the
|
||||
// image height is not a multiple of the strip or tile height, then
|
||||
// truncate the estimate of the byte count of the last strip to avoid
|
||||
// reading past the end of the data
|
||||
if (tw <= w && h % th != 0) {
|
||||
int numRowsInLastStrip = (int)(h - (ny - 1)*th);
|
||||
packetByteCounts[numPackets - 1] = numRowsInLastStrip*bytesPerRow;
|
||||
}
|
||||
|
||||
f = new TIFFField(t, TIFFTag.TIFF_LONG, numPackets, packetByteCounts);
|
||||
addTIFFField(f);
|
||||
byteCounts.add(f);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
//
|
||||
// Verify that data pointed to outside of the IFD itself are within the
|
||||
// stream. To be called after all fields have been read and populated.
|
||||
@ -502,8 +629,19 @@ public class TIFFIFD extends TIFFDirectory {
|
||||
|
||||
// Ensure there is at least a data pointer for JPEG interchange format or
|
||||
// both data offsets and byte counts for other compression types.
|
||||
if (jpegOffset == null && (offsets.size() == 0 || byteCounts.size() == 0)) {
|
||||
throw new IIOException("Insufficient data offsets or byte counts");
|
||||
if (jpegOffset == null
|
||||
&& (offsets.size() == 0 || byteCounts.size() == 0)) {
|
||||
boolean throwException = true;
|
||||
if (offsets.size() != 0 && byteCounts.size() == 0) {
|
||||
// Attempt to calculate missing byte counts
|
||||
int expectedSize = offsets.get(0).getCount();
|
||||
throwException =
|
||||
!calculateByteCounts(expectedSize, byteCounts);
|
||||
}
|
||||
if (throwException) {
|
||||
throw new IIOException
|
||||
("Insufficient data offsets or byte counts");
|
||||
}
|
||||
}
|
||||
|
||||
// JPEGQTables - one 64-byte table for each offset.
|
||||
|
@ -1113,6 +1113,7 @@ public class TIFFImageReader extends ImageReader {
|
||||
long offset = getTileOrStripOffset(tileIndex);
|
||||
long byteCount = getTileOrStripByteCount(tileIndex);
|
||||
|
||||
decompressor.setPlanarBand(band);
|
||||
decompressor.setStream(stream);
|
||||
decompressor.setOffset(offset);
|
||||
decompressor.setByteCount((int) byteCount);
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2002, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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,6 +47,7 @@ import sun.awt.UNIXToolkit;
|
||||
import sun.awt.OSInfo;
|
||||
import sun.security.action.GetPropertyAction;
|
||||
import sun.swing.DefaultLayoutStyle;
|
||||
import sun.swing.SwingAccessor;
|
||||
import sun.swing.SwingUtilities2;
|
||||
|
||||
/**
|
||||
@ -288,7 +289,9 @@ public class GTKLookAndFeel extends SynthLookAndFeel {
|
||||
}
|
||||
|
||||
private void initResourceBundle(UIDefaults table) {
|
||||
table.addResourceBundle("com.sun.java.swing.plaf.gtk.resources.gtk");
|
||||
SwingAccessor.getUIDefaultsAccessor()
|
||||
.addInternalBundle(table,
|
||||
"com.sun.java.swing.plaf.gtk.resources.gtk");
|
||||
}
|
||||
|
||||
protected void initComponentDefaults(UIDefaults table) {
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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,6 +43,7 @@ import javax.swing.plaf.basic.BasicBorders;
|
||||
import javax.swing.plaf.basic.BasicComboBoxRenderer;
|
||||
import javax.swing.plaf.basic.BasicComboBoxEditor;
|
||||
|
||||
import sun.swing.SwingAccessor;
|
||||
import sun.swing.SwingUtilities2;
|
||||
import sun.awt.OSInfo;
|
||||
|
||||
@ -179,7 +180,9 @@ public class MotifLookAndFeel extends BasicLookAndFeel
|
||||
* used for getting localized defaults.
|
||||
*/
|
||||
private void initResourceBundle(UIDefaults table) {
|
||||
table.addResourceBundle( "com.sun.java.swing.plaf.motif.resources.motif" );
|
||||
SwingAccessor.getUIDefaultsAccessor()
|
||||
.addInternalBundle(table,
|
||||
"com.sun.java.swing.plaf.motif.resources.motif");
|
||||
}
|
||||
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -68,6 +68,7 @@ import sun.security.action.GetPropertyAction;
|
||||
|
||||
import sun.swing.DefaultLayoutStyle;
|
||||
import sun.swing.ImageIconUIResource;
|
||||
import sun.swing.SwingAccessor;
|
||||
import sun.swing.icon.SortArrowIcon;
|
||||
import sun.swing.SwingUtilities2;
|
||||
import sun.swing.StringUIClientPropertyKey;
|
||||
@ -287,7 +288,9 @@ public class WindowsLookAndFeel extends BasicLookAndFeel
|
||||
* used for getting localized defaults.
|
||||
*/
|
||||
private void initResourceBundle(UIDefaults table) {
|
||||
table.addResourceBundle( "com.sun.java.swing.plaf.windows.resources.windows" );
|
||||
SwingAccessor.getUIDefaultsAccessor()
|
||||
.addInternalBundle(table,
|
||||
"com.sun.java.swing.plaf.windows.resources.windows");
|
||||
}
|
||||
|
||||
// XXX - there are probably a lot of redundant values that could be removed.
|
||||
|
@ -1005,15 +1005,15 @@ final class DirectAudioDevice extends AbstractMixer {
|
||||
private static final class DirectClip extends DirectDL
|
||||
implements Clip, Runnable, AutoClosingClip {
|
||||
|
||||
private Thread thread;
|
||||
private byte[] audioData = null;
|
||||
private int frameSize; // size of one frame in bytes
|
||||
private int m_lengthInFrames;
|
||||
private int loopCount;
|
||||
private int clipBytePosition; // index in the audioData array at current playback
|
||||
private int newFramePosition; // set in setFramePosition()
|
||||
private int loopStartFrame;
|
||||
private int loopEndFrame; // the last sample included in the loop
|
||||
private volatile Thread thread;
|
||||
private volatile byte[] audioData = null;
|
||||
private volatile int frameSize; // size of one frame in bytes
|
||||
private volatile int m_lengthInFrames;
|
||||
private volatile int loopCount;
|
||||
private volatile int clipBytePosition; // index in the audioData array at current playback
|
||||
private volatile int newFramePosition; // set in setFramePosition()
|
||||
private volatile int loopStartFrame;
|
||||
private volatile int loopEndFrame; // the last sample included in the loop
|
||||
|
||||
// auto closing clip support
|
||||
private boolean autoclosing = false;
|
||||
@ -1345,7 +1345,8 @@ final class DirectAudioDevice extends AbstractMixer {
|
||||
@Override
|
||||
public void run() {
|
||||
if (Printer.trace) Printer.trace(">>> DirectClip: run() threadID="+Thread.currentThread().getId());
|
||||
while (thread != null) {
|
||||
Thread curThread = Thread.currentThread();
|
||||
while (thread == curThread) {
|
||||
// doIO is volatile, but we could check it, then get
|
||||
// pre-empted while another thread changes doIO and notifies,
|
||||
// before we wait (so we sleep in wait forever).
|
||||
@ -1353,7 +1354,12 @@ final class DirectAudioDevice extends AbstractMixer {
|
||||
if (!doIO) {
|
||||
try {
|
||||
lock.wait();
|
||||
} catch(InterruptedException ie) {}
|
||||
} catch(InterruptedException ie) {
|
||||
} finally {
|
||||
if (thread != curThread) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
while (doIO) {
|
||||
|
@ -28,8 +28,6 @@ questions.
|
||||
</head>
|
||||
|
||||
<body bgcolor="white">
|
||||
|
||||
<body>
|
||||
Public classes used by the built-in TIFF plug-ins.
|
||||
|
||||
<p>
|
||||
|
@ -487,7 +487,7 @@ public class JColorChooser extends JComponent implements Accessible {
|
||||
= "An array of different chooser types.")
|
||||
public void setChooserPanels( AbstractColorChooserPanel[] panels) {
|
||||
AbstractColorChooserPanel[] oldValue = chooserPanels;
|
||||
chooserPanels = panels;
|
||||
chooserPanels = Arrays.copyOf(panels, panels.length);
|
||||
firePropertyChange(CHOOSER_PANELS_PROPERTY, oldValue, panels);
|
||||
}
|
||||
|
||||
@ -497,7 +497,7 @@ public class JColorChooser extends JComponent implements Accessible {
|
||||
* @return an array of <code>AbstractColorChooserPanel</code> objects
|
||||
*/
|
||||
public AbstractColorChooserPanel[] getChooserPanels() {
|
||||
return chooserPanels;
|
||||
return Arrays.copyOf(chooserPanels, chooserPanels.length);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -48,6 +48,7 @@ import java.io.InvalidObjectException;
|
||||
import java.io.ObjectInputStream;
|
||||
import java.io.ObjectOutputStream;
|
||||
import java.io.Serializable;
|
||||
import java.util.Arrays;
|
||||
import java.util.Vector;
|
||||
import javax.swing.plaf.OptionPaneUI;
|
||||
import javax.swing.event.InternalFrameEvent;
|
||||
@ -1812,7 +1813,7 @@ public class JOptionPane extends JComponent implements Accessible
|
||||
Icon icon, Object[] options, Object initialValue) {
|
||||
|
||||
this.message = message;
|
||||
this.options = options;
|
||||
this.options = options == null ? null : Arrays.copyOf(options, options.length);
|
||||
this.initialValue = initialValue;
|
||||
this.icon = icon;
|
||||
setMessageType(messageType);
|
||||
@ -1972,7 +1973,9 @@ public class JOptionPane extends JComponent implements Accessible
|
||||
public void setOptions(Object[] newOptions) {
|
||||
Object[] oldOptions = options;
|
||||
|
||||
options = newOptions;
|
||||
options = newOptions == null
|
||||
? null
|
||||
: Arrays.copyOf(newOptions, newOptions.length);
|
||||
firePropertyChange(OPTIONS_PROPERTY, oldOptions, options);
|
||||
}
|
||||
|
||||
@ -1983,14 +1986,7 @@ public class JOptionPane extends JComponent implements Accessible
|
||||
* @see #setOptions
|
||||
*/
|
||||
public Object[] getOptions() {
|
||||
if(options != null) {
|
||||
int optionCount = options.length;
|
||||
Object[] retOptions = new Object[optionCount];
|
||||
|
||||
System.arraycopy(options, 0, retOptions, 0, optionCount);
|
||||
return retOptions;
|
||||
}
|
||||
return options;
|
||||
return options == null ? null : Arrays.copyOf(options, options.length);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -2139,7 +2135,9 @@ public class JOptionPane extends JComponent implements Accessible
|
||||
public void setSelectionValues(Object[] newValues) {
|
||||
Object[] oldValues = selectionValues;
|
||||
|
||||
selectionValues = newValues;
|
||||
selectionValues = newValues == null
|
||||
? null
|
||||
: Arrays.copyOf(newValues, newValues.length);
|
||||
firePropertyChange(SELECTION_VALUES_PROPERTY, oldValues, newValues);
|
||||
if(selectionValues != null)
|
||||
setWantsInput(true);
|
||||
@ -2152,7 +2150,9 @@ public class JOptionPane extends JComponent implements Accessible
|
||||
* @see #setSelectionValues
|
||||
*/
|
||||
public Object[] getSelectionValues() {
|
||||
return selectionValues;
|
||||
return selectionValues == null
|
||||
? null
|
||||
: Arrays.copyOf(selectionValues, selectionValues.length);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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,7 @@ import java.security.PrivilegedAction;
|
||||
|
||||
import sun.reflect.misc.MethodUtil;
|
||||
import sun.reflect.misc.ReflectUtil;
|
||||
import sun.swing.SwingAccessor;
|
||||
import sun.swing.SwingUtilities2;
|
||||
|
||||
/**
|
||||
@ -91,6 +92,10 @@ public class UIDefaults extends Hashtable<Object,Object>
|
||||
*/
|
||||
private Map<Locale, Map<String, Object>> resourceCache;
|
||||
|
||||
static {
|
||||
SwingAccessor.setUIDefaultsAccessor(UIDefaults::addInternalBundle);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates an empty defaults table.
|
||||
*/
|
||||
@ -881,29 +886,49 @@ public class UIDefaults extends Hashtable<Object,Object>
|
||||
|
||||
/**
|
||||
* Adds a resource bundle to the list of resource bundles that are
|
||||
* searched for localized values. Resource bundles are searched in the
|
||||
* reverse order they were added. In other words, the most recently added
|
||||
* bundle is searched first.
|
||||
* searched for localized values. Resource bundles are searched in
|
||||
* the reverse order they were added, using the
|
||||
* {@linkplain ClassLoader#getSystemClassLoader application class loader}.
|
||||
* In other words, the most recently added bundle is searched first.
|
||||
*
|
||||
* @param bundleName the base name of the resource bundle to be added
|
||||
* @see java.util.ResourceBundle
|
||||
* @see #removeResourceBundle
|
||||
* @see ResourceBundle#getBundle(String, Locale, ClassLoader)
|
||||
* @since 1.4
|
||||
*/
|
||||
public synchronized void addResourceBundle( String bundleName ) {
|
||||
if( bundleName == null ) {
|
||||
public synchronized void addResourceBundle(final String bundleName) {
|
||||
if (bundleName == null) {
|
||||
return;
|
||||
}
|
||||
if( resourceBundles == null ) {
|
||||
if (isDesktopResourceBundle(bundleName)) {
|
||||
// Only the java.desktop itself can register resource bundles from
|
||||
// java.desktop module
|
||||
return;
|
||||
}
|
||||
addInternalBundle(bundleName);
|
||||
}
|
||||
|
||||
/**
|
||||
* This methods should be used to register internal resource bundles from
|
||||
* the java.desktop module.
|
||||
*
|
||||
* @param bundleName the base name of the resource bundle to be added
|
||||
* @since 9
|
||||
*/
|
||||
private synchronized void addInternalBundle(final String bundleName) {
|
||||
if (bundleName == null) {
|
||||
return;
|
||||
}
|
||||
if (resourceBundles == null) {
|
||||
resourceBundles = new Vector<String>(5);
|
||||
}
|
||||
if (!resourceBundles.contains(bundleName)) {
|
||||
resourceBundles.add( bundleName );
|
||||
resourceBundles.add(bundleName);
|
||||
resourceCache.clear();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Removes a resource bundle from the list of resource bundles that are
|
||||
* searched for localized defaults.
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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 @@ import javax.sound.sampled.*;
|
||||
|
||||
import sun.awt.AppContext;
|
||||
import sun.awt.SunToolkit;
|
||||
|
||||
import sun.swing.SwingAccessor;
|
||||
import sun.swing.SwingUtilities2;
|
||||
import sun.swing.icon.SortArrowIcon;
|
||||
|
||||
@ -439,7 +439,9 @@ public abstract class BasicLookAndFeel extends LookAndFeel implements Serializab
|
||||
*/
|
||||
private void initResourceBundle(UIDefaults table) {
|
||||
table.setDefaultLocale( Locale.getDefault() );
|
||||
table.addResourceBundle( "com.sun.swing.internal.plaf.basic.resources.basic" );
|
||||
SwingAccessor.getUIDefaultsAccessor()
|
||||
.addInternalBundle(table,
|
||||
"com.sun.swing.internal.plaf.basic.resources.basic");
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1998, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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,6 +43,8 @@ import sun.awt.*;
|
||||
import sun.security.action.GetPropertyAction;
|
||||
import sun.swing.DefaultLayoutStyle;
|
||||
import static javax.swing.UIDefaults.LazyValue;
|
||||
|
||||
import sun.swing.SwingAccessor;
|
||||
import sun.swing.SwingUtilities2;
|
||||
|
||||
/**
|
||||
@ -418,7 +420,9 @@ public class MetalLookAndFeel extends BasicLookAndFeel
|
||||
* used for getting localized defaults.
|
||||
*/
|
||||
private void initResourceBundle(UIDefaults table) {
|
||||
table.addResourceBundle( "com.sun.swing.internal.plaf.metal.resources.metal" );
|
||||
SwingAccessor.getUIDefaultsAccessor()
|
||||
.addInternalBundle(table,
|
||||
"com.sun.swing.internal.plaf.metal.resources.metal");
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2002, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -647,9 +647,12 @@ public class SynthLookAndFeel extends BasicLookAndFeel {
|
||||
|
||||
Region.registerUIs(table);
|
||||
table.setDefaultLocale(Locale.getDefault());
|
||||
table.addResourceBundle(
|
||||
"com.sun.swing.internal.plaf.basic.resources.basic" );
|
||||
table.addResourceBundle("com.sun.swing.internal.plaf.synth.resources.synth");
|
||||
SwingAccessor.getUIDefaultsAccessor()
|
||||
.addInternalBundle(table,
|
||||
"com.sun.swing.internal.plaf.basic.resources.basic");
|
||||
SwingAccessor.getUIDefaultsAccessor()
|
||||
.addInternalBundle(table,
|
||||
"com.sun.swing.internal.plaf.synth.resources.synth");
|
||||
|
||||
// SynthTabbedPaneUI supports rollover on tabs, GTK does not
|
||||
table.put("TabbedPane.isTabRollover", Boolean.TRUE);
|
||||
|
@ -32,7 +32,7 @@ import java.io.*;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.LinkOption;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.Callable;
|
||||
|
||||
@ -244,7 +244,7 @@ public abstract class ShellFolder extends File {
|
||||
return (ShellFolder)file;
|
||||
}
|
||||
|
||||
if (!Files.exists(file.toPath(), LinkOption.NOFOLLOW_LINKS)) {
|
||||
if (!Files.exists(Paths.get(file.getPath()), LinkOption.NOFOLLOW_LINKS)) {
|
||||
throw new FileNotFoundException();
|
||||
}
|
||||
return shellFolderManager.createShellFolder(file);
|
||||
|
@ -99,6 +99,10 @@ public class TrueTypeFont extends FileFont {
|
||||
public static final int ottoTag = 0x4f54544f; // 'otto' - OpenType font
|
||||
|
||||
/* -- ID's used in the 'name' table */
|
||||
public static final int MAC_PLATFORM_ID = 1;
|
||||
public static final int MACROMAN_SPECIFIC_ID = 0;
|
||||
public static final int MACROMAN_ENGLISH_LANG = 0;
|
||||
|
||||
public static final int MS_PLATFORM_ID = 3;
|
||||
/* MS locale id for US English is the "default" */
|
||||
public static final short ENGLISH_LOCALE_ID = 0x0409; // 1033 decimal
|
||||
@ -1108,7 +1112,12 @@ public class TrueTypeFont extends FileFont {
|
||||
metrics[offset+3] = ulSize * pointSize;
|
||||
}
|
||||
|
||||
private String makeString(byte[] bytes, int len, short encoding) {
|
||||
private String makeString(byte[] bytes, int len,
|
||||
short platformID, short encoding) {
|
||||
|
||||
if (platformID == MAC_PLATFORM_ID) {
|
||||
encoding = -1; // hack so we can re-use the code below.
|
||||
}
|
||||
|
||||
/* Check for fonts using encodings 2->6 is just for
|
||||
* some old DBCS fonts, apparently mostly on Solaris.
|
||||
@ -1130,6 +1139,7 @@ public class TrueTypeFont extends FileFont {
|
||||
|
||||
String charset;
|
||||
switch (encoding) {
|
||||
case -1: charset = "US-ASCII";break;
|
||||
case 1: charset = "UTF-16"; break; // most common case first.
|
||||
case 0: charset = "UTF-16"; break; // symbol uses this
|
||||
case 2: charset = "SJIS"; break;
|
||||
@ -1175,7 +1185,8 @@ public class TrueTypeFont extends FileFont {
|
||||
|
||||
for (int i=0; i<numRecords; i++) {
|
||||
short platformID = sbuffer.get();
|
||||
if (platformID != MS_PLATFORM_ID) {
|
||||
if (platformID != MS_PLATFORM_ID &&
|
||||
platformID != MAC_PLATFORM_ID) {
|
||||
sbuffer.position(sbuffer.position()+5);
|
||||
continue; // skip over this record.
|
||||
}
|
||||
@ -1185,6 +1196,14 @@ public class TrueTypeFont extends FileFont {
|
||||
int nameLen = ((int) sbuffer.get()) & 0xffff;
|
||||
int namePtr = (((int) sbuffer.get()) & 0xffff) + stringPtr;
|
||||
String tmpName = null;
|
||||
|
||||
// only want MacRoman encoding and English name on Mac.
|
||||
if ((platformID == MAC_PLATFORM_ID) &&
|
||||
(encodingID != MACROMAN_SPECIFIC_ID ||
|
||||
langID != MACROMAN_ENGLISH_LANG)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
switch (nameID) {
|
||||
|
||||
case FAMILY_NAME_ID:
|
||||
@ -1196,7 +1215,7 @@ public class TrueTypeFont extends FileFont {
|
||||
{
|
||||
buffer.position(namePtr);
|
||||
buffer.get(name, 0, nameLen);
|
||||
tmpName = makeString(name, nameLen, encodingID);
|
||||
tmpName = makeString(name, nameLen, platformID, encodingID);
|
||||
if (familyName == null || langID == ENGLISH_LOCALE_ID){
|
||||
familyName = tmpName;
|
||||
}
|
||||
@ -1229,7 +1248,7 @@ public class TrueTypeFont extends FileFont {
|
||||
{
|
||||
buffer.position(namePtr);
|
||||
buffer.get(name, 0, nameLen);
|
||||
tmpName = makeString(name, nameLen, encodingID);
|
||||
tmpName = makeString(name, nameLen, platformID, encodingID);
|
||||
|
||||
if (fullName == null || langID == ENGLISH_LOCALE_ID) {
|
||||
fullName = tmpName;
|
||||
@ -1290,7 +1309,7 @@ public class TrueTypeFont extends FileFont {
|
||||
|| langID == findLocaleID)) {
|
||||
buffer.position(namePtr);
|
||||
buffer.get(name, 0, nameLen);
|
||||
foundName = makeString(name, nameLen, encodingID);
|
||||
foundName = makeString(name, nameLen, platformID, encodingID);
|
||||
if (langID == findLocaleID) {
|
||||
return foundName;
|
||||
}
|
||||
@ -1627,7 +1646,7 @@ public class TrueTypeFont extends FileFont {
|
||||
if (nameID == requestedID) {
|
||||
buffer.position(namePtr);
|
||||
buffer.get(name, 0, nameLen);
|
||||
names.add(makeString(name, nameLen, encodingID));
|
||||
names.add(makeString(name, nameLen, platformID, encodingID));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -548,7 +548,7 @@ public class FilePane extends JPanel implements PropertyChangeListener {
|
||||
actions = actionList.toArray(new Action[actionList.size()]);
|
||||
}
|
||||
|
||||
return actions;
|
||||
return Arrays.copyOf(actions, actions.length);
|
||||
}
|
||||
|
||||
protected void createActionMap() {
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2009, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -91,6 +91,16 @@ public final class SwingAccessor {
|
||||
void updateCursor(JLightweightFrame frame);
|
||||
}
|
||||
|
||||
/**
|
||||
* An accessor for the UIDefaults class.
|
||||
*/
|
||||
public interface UIDefaultsAccessor {
|
||||
/**
|
||||
* Adds a resource bundle to the list of resource bundles.
|
||||
*/
|
||||
void addInternalBundle(UIDefaults uiDefaults, String bundleName);
|
||||
}
|
||||
|
||||
/**
|
||||
* An accessor for the RepaintManager class.
|
||||
*/
|
||||
@ -183,6 +193,28 @@ public final class SwingAccessor {
|
||||
return jLightweightFrameAccessor;
|
||||
}
|
||||
|
||||
/**
|
||||
* The UIDefaults class accessor object
|
||||
*/
|
||||
private static UIDefaultsAccessor uiDefaultsAccessor;
|
||||
|
||||
/**
|
||||
* Set an accessor object for the UIDefaults class.
|
||||
*/
|
||||
public static void setUIDefaultsAccessor(UIDefaultsAccessor accessor) {
|
||||
uiDefaultsAccessor = accessor;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the accessor object for the JLightweightFrame class
|
||||
*/
|
||||
public static UIDefaultsAccessor getUIDefaultsAccessor() {
|
||||
if (uiDefaultsAccessor == null) {
|
||||
unsafe.ensureClassInitialized(UIDefaults.class);
|
||||
}
|
||||
return uiDefaultsAccessor;
|
||||
}
|
||||
|
||||
/**
|
||||
* The RepaintManager class accessor object.
|
||||
*/
|
||||
|
@ -1,28 +1,3 @@
|
||||
/*
|
||||
* 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
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#if 0
|
||||
CHANGES - changes for libpng
|
||||
|
||||
@ -618,7 +593,7 @@ Version 1.0.5e [November 30, 1999]
|
||||
with trailing compressed parts easier in the future, and added new functions
|
||||
png_free_iCCP, png_free_pCAL, png_free_sPLT, png_free_text, png_get_iCCP,
|
||||
png_get_spalettes, png_set_iCCP, png_set_spalettes (Eric S. Raymond).
|
||||
NOTE: Applications that write text chunks MUST define png_text->lang
|
||||
NOTE: Applications that write text chunks MUST define png_text->lang
|
||||
before calling png_set_text(). It must be set to NULL if you want to
|
||||
write tEXt or zTXt chunks. If you want your application to be able to
|
||||
run with older versions of libpng, use
|
||||
@ -5621,6 +5596,204 @@ Version 1.6.23rc02 [June 4, 2016]
|
||||
Version 1.6.23 [June 9, 2016]
|
||||
Fixed bad link to RFC2083 in png.5 (Nikola Forro).
|
||||
|
||||
Version 1.6.24beta01 [June 11, 2016]
|
||||
Avoid potential overflow of the PNG_IMAGE_SIZE macro. This macro
|
||||
is not used within libpng, but is used in some of the examples.
|
||||
|
||||
Version 1.6.24beta02 [June 23, 2016]
|
||||
Correct filter heuristic overflow handling. This was broken when the
|
||||
write filter code was moved out-of-line; if there is a single filter and
|
||||
the heuristic sum overflows the calculation of the filtered line is not
|
||||
completed. In versions prior to 1.6 the code was duplicated in-line
|
||||
and the check not performed, so the filter operation completed; however,
|
||||
in the multi-filter case where the sum is performed the 'none' filter would
|
||||
be selected if all the sums overflowed, even if it wasn't in the filter
|
||||
list. The fix to the first problem is simply to provide PNG_SIZE_MAX as
|
||||
the current lmins sum value; this means the sum can never exceed it and
|
||||
overflows silently. A reasonable compiler that does choose to inline
|
||||
the code will simply eliminate the sum check.
|
||||
The fix to the second problem is to use high precision arithmetic (this is
|
||||
implemented in 1.7), however a simple safe fix here is to chose the lowest
|
||||
numbered filter in the list from png_set_filter (this only works if the
|
||||
first problem is also fixed) (John Bowler).
|
||||
Use a more efficient absolute value calculation on SSE2 (Matthieu Darbois).
|
||||
Fixed the case where PNG_IMAGE_BUFFER_SIZE can overflow in the application
|
||||
as a result of the application using an increased 'row_stride'; previously
|
||||
png_image_finish_read only checked for overflow on the base calculation of
|
||||
components. (I.e. it checked for overflow of a 32-bit number on the total
|
||||
number of pixel components in the output format, not the possibly padded row
|
||||
length and not the number of bytes, which for linear formats is twice the
|
||||
number of components.)
|
||||
MSVC does not like '-(unsigned)', so replaced it with 0U-(unsigned)
|
||||
MSVC does not like (uInt) = -(unsigned) (i.e. as an initializer), unless
|
||||
the conversion is explicitly invoked by a cast.
|
||||
Put the SKIP definition in the correct place. It needs to come after the
|
||||
png.h include (see all the other .c files in contrib/libtests) because it
|
||||
depends on PNG_LIBPNG_VER.
|
||||
Removed the three compile warning options from the individual project
|
||||
files into the zlib.props globals. It increases the warning level from 4
|
||||
to All and adds a list of the warnings that need to be turned off. This is
|
||||
semi-documentary; the intent is to tell libpng users which warnings have
|
||||
been examined and judged non-fixable at present. The warning about
|
||||
structure padding is fixable, but it would be a signficant change (moving
|
||||
structure members around).
|
||||
|
||||
Version 1.6.24beta03 [July 4, 2016]
|
||||
Optimized absolute value calculation in filter selection, similar to
|
||||
code in the PAETH decoder in pngrutil.c. Build with PNG_USE_ABS to
|
||||
use this.
|
||||
Added pngcp to the build together with a pngcp.dfa configuration test.
|
||||
Added high resolution timing to pngcp.
|
||||
Added "Common linking failures" section to INSTALL.
|
||||
Relocated misplaced #endif in png.c sRGB profile checking.
|
||||
Fixed two Coverity issues in pngcp.c.
|
||||
|
||||
Version 1.6.24beta04 [July 8, 2016]
|
||||
Avoid filter-selection heuristic sum calculations in cases where only one
|
||||
filter is a candidate for selection. This trades off code size (added
|
||||
private png_setup_*_row_only() functions) for speed.
|
||||
|
||||
Version 1.6.24beta05 [July 13, 2016]
|
||||
Fixed some indentation to comply with our coding style.
|
||||
Added contrib/tools/reindent.
|
||||
|
||||
Version 1.6.24beta06 [July 18, 2016]
|
||||
Fixed more indentation to comply with our coding style.
|
||||
Eliminated unnecessary tests of boolean png_isaligned() vs 0.
|
||||
|
||||
Version 1.6.24rc01 [July 25, 2016]
|
||||
No changes.
|
||||
|
||||
Version 1.6.24rc02 [August 1, 2016]
|
||||
Conditionally compile SSE2 headers in contrib/intel/intel_sse.patch
|
||||
Conditionally compile png_decompress_chunk().
|
||||
|
||||
Version 1.6.24rc03 [August 2, 2016]
|
||||
Conditionally compile ARM_NEON headers in pngpriv.h
|
||||
Updated contrib/intel/intel_sse.patch
|
||||
|
||||
Version 1.6.24[August 4, 2016]
|
||||
No changes.
|
||||
|
||||
Version 1.6.25beta01 [August 12, 2016]
|
||||
Reject oversized iCCP profile immediately.
|
||||
Cleaned up PNG_DEBUG compile of pngtest.c.
|
||||
Conditionally compile png_inflate().
|
||||
|
||||
Version 1.6.25beta02 [August 18, 2016]
|
||||
Don't install pngcp; it conflicts with pngcp in the pngtools package.
|
||||
Minor editing of INSTALL, (whitespace, added copyright line)
|
||||
|
||||
Version 1.6.25rc01 [August 24, 2016]
|
||||
No changes.
|
||||
|
||||
Version 1.6.25rc02 [August 29, 2016]
|
||||
Added MIPS support (Mandar Sahastrabuddhe <Mandar.Sahastrabuddhe@imgtec.com>).
|
||||
Only the UP filter is currently implemented.
|
||||
|
||||
Version 1.6.25rc03 [August 29, 2016]
|
||||
Rebased contrib/intel/intel_sse.patch after the MIPS implementation.
|
||||
|
||||
Version 1.6.25rc04 [August 30, 2016]
|
||||
Added MIPS support for SUB, AVG, and PAETH filters (Mandar Sahastrabuddhe).
|
||||
|
||||
Version 1.6.25rc05 [August 30, 2016]
|
||||
Rebased contrib/intel/intel_sse.patch after the MIPS implementation update..
|
||||
|
||||
Version 1.6.25 [September 1, 2016]
|
||||
No changes.
|
||||
|
||||
Version 1.6.26beta01 [September 26, 2016]
|
||||
Fixed handling zero length IDAT in pngfix (bug report by Agostino Sarubbo,
|
||||
bugfix by John Bowler).
|
||||
Do not issue a png_error() on read in png_set_pCAL() because png_handle_pCAL
|
||||
has allocated memory that libpng needs to free.
|
||||
Conditionally compile png_set_benign_errors() in pngread.c and pngtest.c
|
||||
Issue a png_benign_error instead of a png_error on ADLER32 mismatch
|
||||
while decoding compressed data chunks.
|
||||
Changed PNG_ZLIB_VERNUM to ZLIB_VERNUM in pngpriv.h, pngstruct.h, and
|
||||
pngrutil.c.
|
||||
If CRC handling of critical chunks has been set to PNG_CRC_QUIET_USE,
|
||||
ignore the ADLER32 checksum in the IDAT chunk as well as the chunk CRCs.
|
||||
Issue png_benign_error() on ADLER32 checksum mismatch instead of png_error().
|
||||
Add tests/badcrc.png and tests/badadler.png to tests/pngtest.
|
||||
Merged pngtest.c with libpng-1.7.0beta84/pngtest.c
|
||||
|
||||
Version 1.6.26beta02 [October 1, 2016]
|
||||
Updated the documentation about CRC and ADLER32 handling.
|
||||
Quieted 117 warnings from clang-3.8 in pngtrans.c, pngread.c,
|
||||
pngwrite.c, pngunknown.c, and pngvalid.c.
|
||||
Quieted 58 (out of 144) -Wconversion compiler warnings by changing
|
||||
flag definitions in pngpriv.h from 0xnnnn to 0xnnnnU and trivial changes
|
||||
in png.c, pngread.c, and pngwutil.c.
|
||||
|
||||
Version 1.6.26beta03 [October 2, 2016]
|
||||
Removed contrib/libtests/*.orig and *.rej that slipped into the tarballs.
|
||||
Quieted the 86 remaining -Wconversion compiler warnings by
|
||||
revising the png_isaligned() macro and trivial changes in png.c,
|
||||
pngerror.c, pngget.c, pngmem.c, pngset.c, pngrtran.c, pngrutil.c,
|
||||
pngwtran.c, pngwrite.c, and pngwutil.c.
|
||||
|
||||
Version 1.6.26beta04 [October 3, 2016]
|
||||
Quieted (bogus?) clang warnings about "absolute value has no effect"
|
||||
when PNG_USE_ABS is defined.
|
||||
Fixed offsets in contrib/intel/intel_sse.patch
|
||||
|
||||
Version 1.6.26beta05 [October 6, 2016]
|
||||
Changed integer constant 4294967294 to unsigned 4294967294U in pngconf.h
|
||||
to avoid a signed/unsigned compare in the preprocessor.
|
||||
|
||||
Version 1.6.26beta06 [October 7, 2016]
|
||||
Use zlib-1.2.8.1 inflateValidate() instead of inflateReset2() to
|
||||
optionally avoid ADLER32 evaluation.
|
||||
|
||||
Version 1.6.26rc01 [October 12, 2016]
|
||||
No changes.
|
||||
|
||||
Version 1.6.26 [October 20, 2016]
|
||||
Cosmetic change, "ptr != 0" to "ptr != NULL" in png.c and pngrutil.c
|
||||
Despammed email addresses (replaced "@" with " at ").
|
||||
|
||||
Version 1.6.27beta01 [November 2, 2016]
|
||||
Restrict the new ADLER32-skipping to IDAT chunks. It broke iCCP chunk
|
||||
handling: an erroneous iCCP chunk would throw a png_error and reject the
|
||||
entire PNG image instead of rejecting just the iCCP chunk with a warning,
|
||||
if built with zlib-1.2.8.1.
|
||||
|
||||
Version 1.6.27rc01 [December 27, 2016]
|
||||
Control ADLER32 checking with new PNG_IGNORE_ADLER32 option.
|
||||
Removed the use of a macro containing the pre-processor 'defined'
|
||||
operator. It is unclear whether this is valid; a macro that
|
||||
"generates" 'defined' is not permitted, but the use of the word
|
||||
"generates" within the C90 standard seems to imply more than simple
|
||||
substitution of an expression itself containing a well-formed defined
|
||||
operation.
|
||||
Added ARM support to CMakeLists.txt (Andreas Franek).
|
||||
|
||||
Version 1.6.27 [December 29, 2016]
|
||||
Fixed a potential null pointer dereference in png_set_text_2() (bug report
|
||||
and patch by Patrick Keshishian, CVE-2016-10087).
|
||||
|
||||
Version 1.6.28rc01 [January 3, 2017]
|
||||
Fixed arm/aarch64 detection in CMakeLists.txt (Gianfranco Costamagna).
|
||||
Added option to Cmake build allowing a custom location of zlib to be
|
||||
specified in a scenario where libpng is being built as a subproject
|
||||
alongside zlib by another project (Sam Serrels).
|
||||
Changed png_ptr->options from a png_byte to png_uint_32, to accomodate
|
||||
up to 16 options.
|
||||
|
||||
Version 1.6.28rc02 [January 4, 2017]
|
||||
Added "include(GNUInstallDirs)" to CMakeLists.txt (Gianfranco Costamagna).
|
||||
Moved SSE2 optimization code into the main libpng source directory.
|
||||
Configure libpng with "configure --enable-intel-sse" or compile
|
||||
libpng with "-DPNG_INTEL_SSE" in CPPFLAGS to enable it.
|
||||
|
||||
Version 1.6.28rc03 [January 4, 2017]
|
||||
Backed out the SSE optimization and last CMakeLists.txt to allow time for QA.
|
||||
|
||||
Version 1.6.28 [January 5, 2017]
|
||||
No changes.
|
||||
|
||||
Send comments/corrections/commendations to png-mng-implement at lists.sf.net
|
||||
(subscription required; visit
|
||||
https://lists.sourceforge.net/lists/listinfo/png-mng-implement
|
||||
|
@ -10,8 +10,8 @@ this sentence.
|
||||
|
||||
This code is released under the libpng license.
|
||||
|
||||
libpng versions 1.0.7, July 1, 2000 through 1.6.23, June 9, 2016 are
|
||||
Copyright (c) 2000-2002, 2004, 2006-2016 Glenn Randers-Pehrson, are
|
||||
libpng versions 1.0.7, July 1, 2000 through 1.6.28, January 5, 2017 are
|
||||
Copyright (c) 2000-2002, 2004, 2006-2017 Glenn Randers-Pehrson, are
|
||||
derived from libpng-1.0.6, and are distributed according to the same
|
||||
disclaimer and license as libpng-1.0.6 with the following individuals
|
||||
added to the list of Contributing Authors:
|
||||
@ -22,6 +22,7 @@ added to the list of Contributing Authors:
|
||||
Cosmin Truta
|
||||
Gilles Vollant
|
||||
James Yu
|
||||
Mandar Sahastrabuddhe
|
||||
|
||||
and with the following additions to the disclaimer:
|
||||
|
||||
@ -127,4 +128,4 @@ any encryption software. See the EAR, paragraphs 734.3(b)(3) and
|
||||
|
||||
Glenn Randers-Pehrson
|
||||
glennrp at users.sourceforge.net
|
||||
June 9, 2016
|
||||
January 5, 2017
|
||||
|
@ -1,4 +1,4 @@
|
||||
README for libpng version 1.6.23 - June 9, 2016 (shared library 16.0)
|
||||
README for libpng version 1.6.28 - January 5, 2017 (shared library 16.0)
|
||||
See the note about version numbers near the top of png.h
|
||||
|
||||
See INSTALL for instructions on how to install libpng.
|
||||
@ -180,15 +180,18 @@ Files in this distribution:
|
||||
pngwutil.c => Write utility functions
|
||||
arm => Contains optimized code for the ARM platform
|
||||
contrib => Contributions
|
||||
arm-neon => Optimized code for ARM-NEON platform
|
||||
examples => Example programs
|
||||
gregbook => source code for PNG reading and writing, from
|
||||
Greg Roelofs' "PNG: The Definitive Guide",
|
||||
O'Reilly, 1999
|
||||
intel => Optimized code for INTEL-SSE2 platform
|
||||
libtests => Test programs
|
||||
pngminim => Minimal decoder, encoder, and progressive decoder
|
||||
programs demonstrating use of pngusr.dfa
|
||||
pngminus => Simple pnm2png and png2pnm programs
|
||||
pngsuite => Test images
|
||||
testpngs
|
||||
tools => Various tools
|
||||
visupng => Contains a MSVC workspace for VisualPng
|
||||
projects => Contains project files and workspaces for
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -29,9 +29,9 @@
|
||||
* However, the following notice accompanied the original version of this
|
||||
* file and, per its terms, should not be removed:
|
||||
*
|
||||
* libpng version 1.6.23, June 9, 2016
|
||||
* libpng version 1.6.28, January 5, 2017
|
||||
*
|
||||
* Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson
|
||||
* Copyright (c) 1998-2002,2004,2006-2017 Glenn Randers-Pehrson
|
||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||
*
|
||||
@ -40,7 +40,7 @@
|
||||
* Authors and maintainers:
|
||||
* libpng versions 0.71, May 1995, through 0.88, January 1996: Guy Schalnat
|
||||
* libpng versions 0.89, June 1996, through 0.96, May 1997: Andreas Dilger
|
||||
* libpng versions 0.97, January 1998, through 1.6.23, June 9, 2016:
|
||||
* libpng versions 0.97, January 1998, through 1.6.28, January 5, 2017:
|
||||
* Glenn Randers-Pehrson.
|
||||
* See also "Contributing Authors", below.
|
||||
*/
|
||||
@ -53,12 +53,8 @@
|
||||
*
|
||||
* This code is released under the libpng license.
|
||||
*
|
||||
* Some files in the "contrib" directory and some configure-generated
|
||||
* files that are distributed with libpng have other copyright owners and
|
||||
* are released under other open source licenses.
|
||||
*
|
||||
* libpng versions 1.0.7, July 1, 2000 through 1.6.23, June 9, 2016 are
|
||||
* Copyright (c) 2000-2002, 2004, 2006-2016 Glenn Randers-Pehrson, are
|
||||
* libpng versions 1.0.7, July 1, 2000 through 1.6.28, January 5, 2017 are
|
||||
* Copyright (c) 2000-2002, 2004, 2006-2017 Glenn Randers-Pehrson, are
|
||||
* derived from libpng-1.0.6, and are distributed according to the same
|
||||
* disclaimer and license as libpng-1.0.6 with the following individuals
|
||||
* added to the list of Contributing Authors:
|
||||
@ -69,6 +65,7 @@
|
||||
* Cosmin Truta
|
||||
* Gilles Vollant
|
||||
* James Yu
|
||||
* Mandar Sahastrabuddhe
|
||||
*
|
||||
* and with the following additions to the disclaimer:
|
||||
*
|
||||
@ -79,10 +76,10 @@
|
||||
* risk of satisfactory quality, performance, accuracy, and effort is with
|
||||
* the user.
|
||||
*
|
||||
* Some files in the "contrib" directory have other copyright owners and
|
||||
* Some files in the "contrib" directory and some configure-generated
|
||||
* files that are distributed with libpng have other copyright owners and
|
||||
* are released under other open source licenses.
|
||||
*
|
||||
*
|
||||
* libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
|
||||
* Copyright (c) 1998-2000 Glenn Randers-Pehrson, are derived from
|
||||
* libpng-0.96, and are distributed according to the same disclaimer and
|
||||
@ -93,9 +90,6 @@
|
||||
* Glenn Randers-Pehrson
|
||||
* Willem van Schaik
|
||||
*
|
||||
* Some files in the "scripts" directory have different copyright owners
|
||||
* but are also released under this license.
|
||||
*
|
||||
* libpng versions 0.89, June 1996, through 0.96, May 1997, are
|
||||
* Copyright (c) 1996-1997 Andreas Dilger, are derived from libpng-0.88,
|
||||
* and are distributed according to the same disclaimer and license as
|
||||
@ -241,11 +235,11 @@
|
||||
* ...
|
||||
* 1.0.19 10 10019 10.so.0.19[.0]
|
||||
* ...
|
||||
* 1.2.56 13 10256 12.so.0.56[.0]
|
||||
* 1.2.57 13 10257 12.so.0.57[.0]
|
||||
* ...
|
||||
* 1.5.27 15 10527 15.so.15.27[.0]
|
||||
* 1.5.28 15 10527 15.so.15.28[.0]
|
||||
* ...
|
||||
* 1.6.23 16 10623 16.so.16.23[.0]
|
||||
* 1.6.28 16 10628 16.so.16.28[.0]
|
||||
*
|
||||
* Henceforth the source version will match the shared-library major
|
||||
* and minor numbers; the shared-library major version number will be
|
||||
@ -273,13 +267,13 @@
|
||||
* Y2K compliance in libpng:
|
||||
* =========================
|
||||
*
|
||||
* June 9, 2016
|
||||
* January 5, 2017
|
||||
*
|
||||
* Since the PNG Development group is an ad-hoc body, we can't make
|
||||
* an official declaration.
|
||||
*
|
||||
* This is your unofficial assurance that libpng from version 0.71 and
|
||||
* upward through 1.6.23 are Y2K compliant. It is my belief that
|
||||
* upward through 1.6.28 are Y2K compliant. It is my belief that
|
||||
* earlier versions were also Y2K compliant.
|
||||
*
|
||||
* Libpng only has two year fields. One is a 2-byte unsigned integer
|
||||
@ -341,9 +335,8 @@
|
||||
*/
|
||||
|
||||
/* Version information for png.h - this should match the version in png.c */
|
||||
#define PNG_LIBPNG_VER_STRING "1.6.23"
|
||||
#define PNG_HEADER_VERSION_STRING \
|
||||
" libpng version 1.6.23 - June 9, 2016\n"
|
||||
#define PNG_LIBPNG_VER_STRING "1.6.28"
|
||||
#define PNG_HEADER_VERSION_STRING " libpng version 1.6.28 - January 5, 2017\n"
|
||||
|
||||
#define PNG_LIBPNG_VER_SONUM 16
|
||||
#define PNG_LIBPNG_VER_DLLNUM 16
|
||||
@ -351,7 +344,7 @@
|
||||
/* These should match the first 3 components of PNG_LIBPNG_VER_STRING: */
|
||||
#define PNG_LIBPNG_VER_MAJOR 1
|
||||
#define PNG_LIBPNG_VER_MINOR 6
|
||||
#define PNG_LIBPNG_VER_RELEASE 23
|
||||
#define PNG_LIBPNG_VER_RELEASE 28
|
||||
|
||||
/* This should match the numeric part of the final component of
|
||||
* PNG_LIBPNG_VER_STRING, omitting any leading zero:
|
||||
@ -382,20 +375,20 @@
|
||||
* version 1.0.0 was mis-numbered 100 instead of 10000). From
|
||||
* version 1.0.1 it's xxyyzz, where x=major, y=minor, z=release
|
||||
*/
|
||||
#define PNG_LIBPNG_VER 10623 /* 1.6.23 */
|
||||
#define PNG_LIBPNG_VER 10628 /* 1.6.28 */
|
||||
|
||||
/* Library configuration: these options cannot be changed after
|
||||
* the library has been built.
|
||||
*/
|
||||
#ifndef PNGLCONF_H
|
||||
/* If pnglibconf.h is missing, you can
|
||||
* copy scripts/pnglibconf.h.prebuilt to pnglibconf.h
|
||||
*/
|
||||
/* If pnglibconf.h is missing, you can
|
||||
* copy scripts/pnglibconf.h.prebuilt to pnglibconf.h
|
||||
*/
|
||||
# include "pnglibconf.h"
|
||||
#endif
|
||||
|
||||
#ifndef PNG_VERSION_INFO_ONLY
|
||||
/* Machine specific configuration. */
|
||||
/* Machine specific configuration. */
|
||||
# include "pngconf.h"
|
||||
#endif
|
||||
|
||||
@ -492,7 +485,7 @@ extern "C" {
|
||||
/* This triggers a compiler error in png.c, if png.c and png.h
|
||||
* do not agree upon the version number.
|
||||
*/
|
||||
typedef char* png_libpng_version_1_6_23;
|
||||
typedef char* png_libpng_version_1_6_28;
|
||||
|
||||
/* Basic control structions. Read libpng-manual.txt or libpng.3 for more info.
|
||||
*
|
||||
@ -685,17 +678,17 @@ typedef png_time * * png_timepp;
|
||||
*/
|
||||
typedef struct png_unknown_chunk_t
|
||||
{
|
||||
png_byte name[5]; /* Textual chunk name with '\0' terminator */
|
||||
png_byte *data; /* Data, should not be modified on read! */
|
||||
png_size_t size;
|
||||
png_byte name[5]; /* Textual chunk name with '\0' terminator */
|
||||
png_byte *data; /* Data, should not be modified on read! */
|
||||
png_size_t size;
|
||||
|
||||
/* On write 'location' must be set using the flag values listed below.
|
||||
* Notice that on read it is set by libpng however the values stored have
|
||||
* more bits set than are listed below. Always treat the value as a
|
||||
* bitmask. On write set only one bit - setting multiple bits may cause the
|
||||
* chunk to be written in multiple places.
|
||||
*/
|
||||
png_byte location; /* mode of operation at read time */
|
||||
/* On write 'location' must be set using the flag values listed below.
|
||||
* Notice that on read it is set by libpng however the values stored have
|
||||
* more bits set than are listed below. Always treat the value as a
|
||||
* bitmask. On write set only one bit - setting multiple bits may cause the
|
||||
* chunk to be written in multiple places.
|
||||
*/
|
||||
png_byte location; /* mode of operation at read time */
|
||||
}
|
||||
png_unknown_chunk;
|
||||
|
||||
@ -2328,8 +2321,10 @@ PNG_EXPORT(171, void, png_set_sCAL_s, (png_const_structrp png_ptr,
|
||||
* except for the IHDR, PLTE, tRNS, IDAT, and IEND chunks (which continue to
|
||||
* be processed by libpng.
|
||||
*/
|
||||
#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
|
||||
PNG_EXPORT(172, void, png_set_keep_unknown_chunks, (png_structrp png_ptr,
|
||||
int keep, png_const_bytep chunk_list, int num_chunks));
|
||||
#endif /* HANDLE_AS_UNKNOWN */
|
||||
|
||||
/* The "keep" PNG_HANDLE_CHUNK_ parameter for the specified chunk is returned;
|
||||
* the result is therefore true (non-zero) if special handling is required,
|
||||
@ -2337,7 +2332,7 @@ PNG_EXPORT(172, void, png_set_keep_unknown_chunks, (png_structrp png_ptr,
|
||||
*/
|
||||
PNG_EXPORT(173, int, png_handle_as_unknown, (png_const_structrp png_ptr,
|
||||
png_const_bytep chunk_name));
|
||||
#endif
|
||||
#endif /* SET_UNKNOWN_CHUNKS */
|
||||
|
||||
#ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED
|
||||
PNG_EXPORT(174, void, png_set_unknown_chunks, (png_const_structrp png_ptr,
|
||||
@ -2558,33 +2553,37 @@ PNG_EXPORT(216, png_uint_32, png_get_io_chunk_type,
|
||||
|
||||
/* fg and bg should be in `gamma 1.0' space; alpha is the opacity */
|
||||
|
||||
# define png_composite(composite, fg, alpha, bg) \
|
||||
{ png_uint_16 temp = (png_uint_16)((png_uint_16)(fg) \
|
||||
* (png_uint_16)(alpha) \
|
||||
+ (png_uint_16)(bg)*(png_uint_16)(255 \
|
||||
- (png_uint_16)(alpha)) + 128); \
|
||||
(composite) = (png_byte)(((temp + (temp >> 8)) >> 8) & 0xff); }
|
||||
# define png_composite(composite, fg, alpha, bg) \
|
||||
{ \
|
||||
png_uint_16 temp = (png_uint_16)((png_uint_16)(fg) \
|
||||
* (png_uint_16)(alpha) \
|
||||
+ (png_uint_16)(bg)*(png_uint_16)(255 \
|
||||
- (png_uint_16)(alpha)) + 128); \
|
||||
(composite) = (png_byte)(((temp + (temp >> 8)) >> 8) & 0xff); \
|
||||
}
|
||||
|
||||
# define png_composite_16(composite, fg, alpha, bg) \
|
||||
{ png_uint_32 temp = (png_uint_32)((png_uint_32)(fg) \
|
||||
* (png_uint_32)(alpha) \
|
||||
+ (png_uint_32)(bg)*(65535 \
|
||||
- (png_uint_32)(alpha)) + 32768); \
|
||||
(composite) = (png_uint_16)(0xffff & ((temp + (temp >> 16)) >> 16)); }
|
||||
# define png_composite_16(composite, fg, alpha, bg) \
|
||||
{ \
|
||||
png_uint_32 temp = (png_uint_32)((png_uint_32)(fg) \
|
||||
* (png_uint_32)(alpha) \
|
||||
+ (png_uint_32)(bg)*(65535 \
|
||||
- (png_uint_32)(alpha)) + 32768); \
|
||||
(composite) = (png_uint_16)(0xffff & ((temp + (temp >> 16)) >> 16)); \
|
||||
}
|
||||
|
||||
#else /* Standard method using integer division */
|
||||
|
||||
# define png_composite(composite, fg, alpha, bg) \
|
||||
(composite) = \
|
||||
(png_byte)(0xff & (((png_uint_16)(fg) * (png_uint_16)(alpha) + \
|
||||
(png_uint_16)(bg) * (png_uint_16)(255 - (png_uint_16)(alpha)) + \
|
||||
127) / 255))
|
||||
# define png_composite(composite, fg, alpha, bg) \
|
||||
(composite) = \
|
||||
(png_byte)(0xff & (((png_uint_16)(fg) * (png_uint_16)(alpha) + \
|
||||
(png_uint_16)(bg) * (png_uint_16)(255 - (png_uint_16)(alpha)) + \
|
||||
127) / 255))
|
||||
|
||||
# define png_composite_16(composite, fg, alpha, bg) \
|
||||
(composite) = \
|
||||
(png_uint_16)(0xffff & (((png_uint_32)(fg) * (png_uint_32)(alpha) + \
|
||||
(png_uint_32)(bg)*(png_uint_32)(65535 - (png_uint_32)(alpha)) + \
|
||||
32767) / 65535))
|
||||
# define png_composite_16(composite, fg, alpha, bg) \
|
||||
(composite) = \
|
||||
(png_uint_16)(0xffff & (((png_uint_32)(fg) * (png_uint_32)(alpha) + \
|
||||
(png_uint_32)(bg)*(png_uint_32)(65535 - (png_uint_32)(alpha)) + \
|
||||
32767) / 65535))
|
||||
#endif /* READ_COMPOSITE_NODIV */
|
||||
|
||||
#ifdef PNG_READ_INT_FUNCTIONS_SUPPORTED
|
||||
@ -2620,38 +2619,38 @@ PNG_EXPORT(207, void, png_save_uint_16, (png_bytep buf, unsigned int i));
|
||||
* format for negative values, which is almost certainly true.
|
||||
*/
|
||||
# define PNG_get_uint_32(buf) \
|
||||
(((png_uint_32)(*(buf)) << 24) + \
|
||||
((png_uint_32)(*((buf) + 1)) << 16) + \
|
||||
((png_uint_32)(*((buf) + 2)) << 8) + \
|
||||
((png_uint_32)(*((buf) + 3))))
|
||||
(((png_uint_32)(*(buf)) << 24) + \
|
||||
((png_uint_32)(*((buf) + 1)) << 16) + \
|
||||
((png_uint_32)(*((buf) + 2)) << 8) + \
|
||||
((png_uint_32)(*((buf) + 3))))
|
||||
|
||||
/* From libpng-1.4.0 until 1.4.4, the png_get_uint_16 macro (but not the
|
||||
* function) incorrectly returned a value of type png_uint_32.
|
||||
*/
|
||||
# define PNG_get_uint_16(buf) \
|
||||
((png_uint_16) \
|
||||
(((unsigned int)(*(buf)) << 8) + \
|
||||
((unsigned int)(*((buf) + 1)))))
|
||||
((png_uint_16) \
|
||||
(((unsigned int)(*(buf)) << 8) + \
|
||||
((unsigned int)(*((buf) + 1)))))
|
||||
|
||||
# define PNG_get_int_32(buf) \
|
||||
((png_int_32)((*(buf) & 0x80) \
|
||||
? -((png_int_32)(((png_get_uint_32(buf)^0xffffffffU)+1U)&0x7fffffffU)) \
|
||||
: (png_int_32)png_get_uint_32(buf)))
|
||||
((png_int_32)((*(buf) & 0x80) \
|
||||
? -((png_int_32)(((png_get_uint_32(buf)^0xffffffffU)+1U)&0x7fffffffU)) \
|
||||
: (png_int_32)png_get_uint_32(buf)))
|
||||
|
||||
/* If PNG_PREFIX is defined the same thing as below happens in pnglibconf.h,
|
||||
* but defining a macro name prefixed with PNG_PREFIX.
|
||||
*/
|
||||
/* If PNG_PREFIX is defined the same thing as below happens in pnglibconf.h,
|
||||
* but defining a macro name prefixed with PNG_PREFIX.
|
||||
*/
|
||||
# ifndef PNG_PREFIX
|
||||
# define png_get_uint_32(buf) PNG_get_uint_32(buf)
|
||||
# define png_get_uint_16(buf) PNG_get_uint_16(buf)
|
||||
# define png_get_int_32(buf) PNG_get_int_32(buf)
|
||||
# define png_get_uint_32(buf) PNG_get_uint_32(buf)
|
||||
# define png_get_uint_16(buf) PNG_get_uint_16(buf)
|
||||
# define png_get_int_32(buf) PNG_get_int_32(buf)
|
||||
# endif
|
||||
#else
|
||||
# ifdef PNG_PREFIX
|
||||
/* No macros; revert to the (redefined) function */
|
||||
# define PNG_get_uint_32 (png_get_uint_32)
|
||||
# define PNG_get_uint_16 (png_get_uint_16)
|
||||
# define PNG_get_int_32 (png_get_int_32)
|
||||
/* No macros; revert to the (redefined) function */
|
||||
# define PNG_get_uint_32 (png_get_uint_32)
|
||||
# define PNG_get_uint_16 (png_get_uint_16)
|
||||
# define PNG_get_int_32 (png_get_int_32)
|
||||
# endif
|
||||
#endif
|
||||
|
||||
@ -3199,9 +3198,9 @@ PNG_EXPORT(245, int, png_image_write_to_memory, (png_imagep image, void *memory,
|
||||
#define PNG_IMAGE_PNG_SIZE_MAX_(image, image_size)\
|
||||
((8U/*sig*/+25U/*IHDR*/+16U/*gAMA*/+44U/*cHRM*/+12U/*IEND*/+\
|
||||
(((image).format&PNG_FORMAT_FLAG_COLORMAP)?/*colormap: PLTE, tRNS*/\
|
||||
12U+3U*(image).colormap_entries/*PLTE data*/+\
|
||||
(((image).format&PNG_FORMAT_FLAG_ALPHA)?\
|
||||
12U/*tRNS*/+(image).colormap_entries:0U):0U)+\
|
||||
12U+3U*(image).colormap_entries/*PLTE data*/+\
|
||||
(((image).format&PNG_FORMAT_FLAG_ALPHA)?\
|
||||
12U/*tRNS*/+(image).colormap_entries:0U):0U)+\
|
||||
12U)+(12U*((image_size)/PNG_ZBUF_SIZE))/*IDAT*/+(image_size))
|
||||
/* A helper for the following macro; if your compiler cannot handle the
|
||||
* following macro use this one with the result of
|
||||
@ -3249,7 +3248,11 @@ PNG_EXPORT(245, int, png_image_write_to_memory, (png_imagep image, void *memory,
|
||||
#endif
|
||||
#define PNG_MAXIMUM_INFLATE_WINDOW 2 /* SOFTWARE: force maximum window */
|
||||
#define PNG_SKIP_sRGB_CHECK_PROFILE 4 /* SOFTWARE: Check ICC profile for sRGB */
|
||||
#define PNG_OPTION_NEXT 6 /* Next option - numbers must be even */
|
||||
#ifdef PNG_MIPS_MSA_API_SUPPORTED
|
||||
# define PNG_MIPS_MSA 6 /* HARDWARE: MIPS Msa SIMD instructions supported */
|
||||
#endif
|
||||
#define PNG_IGNORE_ADLER32 8
|
||||
#define PNG_OPTION_NEXT 10 /* Next option - numbers must be even */
|
||||
|
||||
/* Return values: NOTE: there are four values and 'off' is *not* zero */
|
||||
#define PNG_OPTION_UNSET 0 /* Unset - defaults to off */
|
||||
|
@ -29,9 +29,9 @@
|
||||
* However, the following notice accompanied the original version of this
|
||||
* file and, per its terms, should not be removed:
|
||||
*
|
||||
* libpng version 1.6.23, June 9, 2016
|
||||
* libpng version 1.6.28, January 5, 2017
|
||||
*
|
||||
* Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson
|
||||
* Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson
|
||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||
*
|
||||
@ -216,27 +216,27 @@
|
||||
* compatible with GCC or Visual C because of different calling conventions.
|
||||
*/
|
||||
# if PNG_API_RULE == 2
|
||||
/* If this line results in an error, either because __watcall is not
|
||||
* understood or because of a redefine just below you cannot use *this*
|
||||
* build of the library with the compiler you are using. *This* build was
|
||||
* build using Watcom and applications must also be built using Watcom!
|
||||
*/
|
||||
/* If this line results in an error, either because __watcall is not
|
||||
* understood or because of a redefine just below you cannot use *this*
|
||||
* build of the library with the compiler you are using. *This* build was
|
||||
* build using Watcom and applications must also be built using Watcom!
|
||||
*/
|
||||
# define PNGCAPI __watcall
|
||||
# endif
|
||||
|
||||
# if defined(__GNUC__) || (defined(_MSC_VER) && (_MSC_VER >= 800))
|
||||
# define PNGCAPI __cdecl
|
||||
# if PNG_API_RULE == 1
|
||||
/* If this line results in an error __stdcall is not understood and
|
||||
* PNG_API_RULE should not have been set to '1'.
|
||||
*/
|
||||
/* If this line results in an error __stdcall is not understood and
|
||||
* PNG_API_RULE should not have been set to '1'.
|
||||
*/
|
||||
# define PNGAPI __stdcall
|
||||
# endif
|
||||
# else
|
||||
/* An older compiler, or one not detected (erroneously) above,
|
||||
* if necessary override on the command line to get the correct
|
||||
* variants for the compiler.
|
||||
*/
|
||||
/* An older compiler, or one not detected (erroneously) above,
|
||||
* if necessary override on the command line to get the correct
|
||||
* variants for the compiler.
|
||||
*/
|
||||
# ifndef PNGCAPI
|
||||
# define PNGCAPI _cdecl
|
||||
# endif
|
||||
@ -253,10 +253,10 @@
|
||||
|
||||
# if (defined(_MSC_VER) && _MSC_VER < 800) ||\
|
||||
(defined(__BORLANDC__) && __BORLANDC__ < 0x500)
|
||||
/* older Borland and MSC
|
||||
* compilers used '__export' and required this to be after
|
||||
* the type.
|
||||
*/
|
||||
/* older Borland and MSC
|
||||
* compilers used '__export' and required this to be after
|
||||
* the type.
|
||||
*/
|
||||
# ifndef PNG_EXPORT_TYPE
|
||||
# define PNG_EXPORT_TYPE(type) type PNG_IMPEXP
|
||||
# endif
|
||||
@ -272,9 +272,9 @@
|
||||
# if (defined(__IBMC__) || defined(__IBMCPP__)) && defined(__OS2__)
|
||||
# define PNGAPI _System
|
||||
# else /* !Windows/x86 && !OS/2 */
|
||||
/* Use the defaults, or define PNG*API on the command line (but
|
||||
* this will have to be done for every compile!)
|
||||
*/
|
||||
/* Use the defaults, or define PNG*API on the command line (but
|
||||
* this will have to be done for every compile!)
|
||||
*/
|
||||
# endif /* other system, !OS/2 */
|
||||
#endif /* !Windows/x86 */
|
||||
|
||||
@ -295,7 +295,7 @@
|
||||
*/
|
||||
#ifndef PNG_IMPEXP
|
||||
# if defined(PNG_USE_DLL) && defined(PNG_DLL_IMPORT)
|
||||
/* This forces use of a DLL, disallowing static linking */
|
||||
/* This forces use of a DLL, disallowing static linking */
|
||||
# define PNG_IMPEXP PNG_DLL_IMPORT
|
||||
# endif
|
||||
|
||||
@ -368,7 +368,7 @@
|
||||
* less efficient code.
|
||||
*/
|
||||
# if defined(__clang__) && defined(__has_attribute)
|
||||
/* Clang defines both __clang__ and __GNUC__. Check __clang__ first. */
|
||||
/* Clang defines both __clang__ and __GNUC__. Check __clang__ first. */
|
||||
# if !defined(PNG_USE_RESULT) && __has_attribute(__warn_unused_result__)
|
||||
# define PNG_USE_RESULT __attribute__((__warn_unused_result__))
|
||||
# endif
|
||||
@ -535,9 +535,9 @@
|
||||
# error "libpng requires a signed 32-bit (or more) type"
|
||||
#endif
|
||||
|
||||
#if UINT_MAX > 4294967294
|
||||
#if UINT_MAX > 4294967294U
|
||||
typedef unsigned int png_uint_32;
|
||||
#elif ULONG_MAX > 4294967294
|
||||
#elif ULONG_MAX > 4294967294U
|
||||
typedef unsigned long int png_uint_32;
|
||||
#else
|
||||
# error "libpng requires an unsigned 32-bit (or more) type"
|
||||
|
@ -29,8 +29,8 @@
|
||||
* However, the following notice accompanied the original version of this
|
||||
* file and, per its terms, should not be removed:
|
||||
*
|
||||
* Last changed in libpng 1.6.15 [November 20, 2014]
|
||||
* Copyright (c) 1998-2002,2004,2006-2014 Glenn Randers-Pehrson
|
||||
* Last changed in libpng 1.6.26 [October 20, 2016]
|
||||
* Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson
|
||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||
*
|
||||
@ -54,7 +54,7 @@ static PNG_FUNCTION(void, png_default_error,PNGARG((png_const_structrp png_ptr,
|
||||
#ifdef PNG_WARNINGS_SUPPORTED
|
||||
static void /* PRIVATE */
|
||||
png_default_warning PNGARG((png_const_structrp png_ptr,
|
||||
png_const_charp warning_message));
|
||||
png_const_charp warning_message));
|
||||
#endif /* WARNINGS */
|
||||
|
||||
/* This function is called whenever there is a fatal error. This function
|
||||
@ -65,7 +65,7 @@ png_default_warning PNGARG((png_const_structrp png_ptr,
|
||||
#ifdef PNG_ERROR_TEXT_SUPPORTED
|
||||
PNG_FUNCTION(void,PNGAPI
|
||||
png_error,(png_const_structrp png_ptr, png_const_charp error_message),
|
||||
PNG_NORETURN)
|
||||
PNG_NORETURN)
|
||||
{
|
||||
#ifdef PNG_ERROR_NUMBERS_SUPPORTED
|
||||
char msg[16];
|
||||
@ -93,18 +93,18 @@ png_error,(png_const_structrp png_ptr, png_const_charp error_message),
|
||||
|
||||
else
|
||||
error_message += offset;
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
if ((png_ptr->flags & PNG_FLAG_STRIP_ERROR_TEXT) != 0)
|
||||
{
|
||||
msg[0] = '0';
|
||||
msg[1] = '\0';
|
||||
error_message = msg;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
if ((png_ptr->flags & PNG_FLAG_STRIP_ERROR_TEXT) != 0)
|
||||
{
|
||||
msg[0] = '0';
|
||||
msg[1] = '\0';
|
||||
error_message = msg;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if (png_ptr != NULL && png_ptr->error_fn != NULL)
|
||||
@ -138,7 +138,7 @@ png_err,(png_const_structrp png_ptr),PNG_NORETURN)
|
||||
*/
|
||||
size_t
|
||||
png_safecat(png_charp buffer, size_t bufsize, size_t pos,
|
||||
png_const_charp string)
|
||||
png_const_charp string)
|
||||
{
|
||||
if (buffer != NULL && pos < bufsize)
|
||||
{
|
||||
@ -159,7 +159,7 @@ png_safecat(png_charp buffer, size_t bufsize, size_t pos,
|
||||
*/
|
||||
png_charp
|
||||
png_format_number(png_const_charp start, png_charp end, int format,
|
||||
png_alloc_size_t number)
|
||||
png_alloc_size_t number)
|
||||
{
|
||||
int count = 0; /* number of digits output */
|
||||
int mincount = 1; /* minimum number required */
|
||||
@ -261,7 +261,7 @@ png_warning(png_const_structrp png_ptr, png_const_charp warning_message)
|
||||
}
|
||||
if (png_ptr != NULL && png_ptr->warning_fn != NULL)
|
||||
(*(png_ptr->warning_fn))(png_constcast(png_structrp,png_ptr),
|
||||
warning_message + offset);
|
||||
warning_message + offset);
|
||||
else
|
||||
png_default_warning(png_ptr, warning_message + offset);
|
||||
}
|
||||
@ -273,7 +273,7 @@ png_warning(png_const_structrp png_ptr, png_const_charp warning_message)
|
||||
*/
|
||||
void
|
||||
png_warning_parameter(png_warning_parameters p, int number,
|
||||
png_const_charp string)
|
||||
png_const_charp string)
|
||||
{
|
||||
if (number > 0 && number <= PNG_WARNING_PARAMETER_COUNT)
|
||||
(void)png_safecat(p[number-1], (sizeof p[number-1]), 0, string);
|
||||
@ -281,7 +281,7 @@ png_warning_parameter(png_warning_parameters p, int number,
|
||||
|
||||
void
|
||||
png_warning_parameter_unsigned(png_warning_parameters p, int number, int format,
|
||||
png_alloc_size_t value)
|
||||
png_alloc_size_t value)
|
||||
{
|
||||
char buffer[PNG_NUMBER_BUFFER_SIZE];
|
||||
png_warning_parameter(p, number, PNG_FORMAT_NUMBER(buffer, format, value));
|
||||
@ -289,7 +289,7 @@ png_warning_parameter_unsigned(png_warning_parameters p, int number, int format,
|
||||
|
||||
void
|
||||
png_warning_parameter_signed(png_warning_parameters p, int number, int format,
|
||||
png_int_32 value)
|
||||
png_int_32 value)
|
||||
{
|
||||
png_alloc_size_t u;
|
||||
png_charp str;
|
||||
@ -310,7 +310,7 @@ png_warning_parameter_signed(png_warning_parameters p, int number, int format,
|
||||
|
||||
void
|
||||
png_formatted_warning(png_const_structrp png_ptr, png_warning_parameters p,
|
||||
png_const_charp message)
|
||||
png_const_charp message)
|
||||
{
|
||||
/* The internal buffer is just 192 bytes - enough for all our messages,
|
||||
* overflow doesn't happen because this code checks! If someone figures
|
||||
@ -419,10 +419,10 @@ png_benign_error(png_const_structrp png_ptr, png_const_charp error_message)
|
||||
void /* PRIVATE */
|
||||
png_app_warning(png_const_structrp png_ptr, png_const_charp error_message)
|
||||
{
|
||||
if ((png_ptr->flags & PNG_FLAG_APP_WARNINGS_WARN) != 0)
|
||||
png_warning(png_ptr, error_message);
|
||||
else
|
||||
png_error(png_ptr, error_message);
|
||||
if ((png_ptr->flags & PNG_FLAG_APP_WARNINGS_WARN) != 0)
|
||||
png_warning(png_ptr, error_message);
|
||||
else
|
||||
png_error(png_ptr, error_message);
|
||||
|
||||
# ifndef PNG_ERROR_TEXT_SUPPORTED
|
||||
PNG_UNUSED(error_message)
|
||||
@ -432,10 +432,10 @@ png_app_warning(png_const_structrp png_ptr, png_const_charp error_message)
|
||||
void /* PRIVATE */
|
||||
png_app_error(png_const_structrp png_ptr, png_const_charp error_message)
|
||||
{
|
||||
if ((png_ptr->flags & PNG_FLAG_APP_ERRORS_WARN) != 0)
|
||||
png_warning(png_ptr, error_message);
|
||||
else
|
||||
png_error(png_ptr, error_message);
|
||||
if ((png_ptr->flags & PNG_FLAG_APP_ERRORS_WARN) != 0)
|
||||
png_warning(png_ptr, error_message);
|
||||
else
|
||||
png_error(png_ptr, error_message);
|
||||
|
||||
# ifndef PNG_ERROR_TEXT_SUPPORTED
|
||||
PNG_UNUSED(error_message)
|
||||
@ -506,7 +506,7 @@ png_format_buffer(png_const_structrp png_ptr, png_charp buffer, png_const_charp
|
||||
#if defined(PNG_READ_SUPPORTED) && defined(PNG_ERROR_TEXT_SUPPORTED)
|
||||
PNG_FUNCTION(void,PNGAPI
|
||||
png_chunk_error,(png_const_structrp png_ptr, png_const_charp error_message),
|
||||
PNG_NORETURN)
|
||||
PNG_NORETURN)
|
||||
{
|
||||
char msg[18+PNG_MAX_ERROR_TEXT];
|
||||
if (png_ptr == NULL)
|
||||
@ -601,7 +601,7 @@ png_fixed_error,(png_const_structrp png_ptr, png_const_charp name),PNG_NORETURN)
|
||||
{
|
||||
# define fixed_message "fixed point overflow in "
|
||||
# define fixed_message_ln ((sizeof fixed_message)-1)
|
||||
int iin;
|
||||
unsigned int iin;
|
||||
char msg[fixed_message_ln+PNG_MAX_ERROR_TEXT];
|
||||
memcpy(msg, fixed_message, fixed_message_ln);
|
||||
iin = 0;
|
||||
@ -648,7 +648,7 @@ png_set_longjmp_fn(png_structrp png_ptr, png_longjmp_ptr longjmp_fn,
|
||||
else
|
||||
{
|
||||
png_ptr->jmp_buf_ptr = png_voidcast(jmp_buf *,
|
||||
png_malloc_warn(png_ptr, jmp_buf_size));
|
||||
png_malloc_warn(png_ptr, jmp_buf_size));
|
||||
|
||||
if (png_ptr->jmp_buf_ptr == NULL)
|
||||
return NULL; /* new NULL return on OOM */
|
||||
@ -737,7 +737,7 @@ png_free_jmpbuf(png_structrp png_ptr)
|
||||
*/
|
||||
static PNG_FUNCTION(void /* PRIVATE */,
|
||||
png_default_error,(png_const_structrp png_ptr, png_const_charp error_message),
|
||||
PNG_NORETURN)
|
||||
PNG_NORETURN)
|
||||
{
|
||||
#ifdef PNG_CONSOLE_IO_SUPPORTED
|
||||
#ifdef PNG_ERROR_NUMBERS_SUPPORTED
|
||||
@ -911,7 +911,7 @@ png_set_strip_error_numbers(png_structrp png_ptr, png_uint_32 strip_mode)
|
||||
*/
|
||||
PNG_FUNCTION(void /* PRIVATE */, (PNGCBAPI
|
||||
png_safe_error),(png_structp png_nonconst_ptr, png_const_charp error_message),
|
||||
PNG_NORETURN)
|
||||
PNG_NORETURN)
|
||||
{
|
||||
const png_const_structrp png_ptr = png_nonconst_ptr;
|
||||
png_imagep image = png_voidcast(png_imagep, png_ptr->error_ptr);
|
||||
@ -934,7 +934,7 @@ png_safe_error),(png_structp png_nonconst_ptr, png_const_charp error_message),
|
||||
/* Missing longjmp buffer, the following is to help debugging: */
|
||||
{
|
||||
size_t pos = png_safecat(image->message, (sizeof image->message), 0,
|
||||
"bad longjmp: ");
|
||||
"bad longjmp: ");
|
||||
png_safecat(image->message, (sizeof image->message), pos,
|
||||
error_message);
|
||||
}
|
||||
|
@ -28,9 +28,9 @@
|
||||
* License version 2 only, as published by the Free Software Foundation.
|
||||
* However, the following notice accompanied the original version of this
|
||||
* file and, per its terms, should not be removed:
|
||||
*
|
||||
* Last changed in libpng 1.6.17 [March 26, 2015]
|
||||
* Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson
|
||||
|
||||
* Last changed in libpng 1.6.26 [October 20, 2016]
|
||||
* Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson
|
||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||
*
|
||||
@ -366,7 +366,7 @@ ppi_from_ppm(png_uint_32 ppm)
|
||||
png_fixed_point result;
|
||||
if (ppm <= PNG_UINT_31_MAX && png_muldiv(&result, (png_int_32)ppm, 127,
|
||||
5000) != 0)
|
||||
return result;
|
||||
return (png_uint_32)result;
|
||||
|
||||
/* Overflow. */
|
||||
return 0;
|
||||
@ -514,7 +514,7 @@ png_get_signature(png_const_structrp png_ptr, png_const_inforp info_ptr)
|
||||
#ifdef PNG_bKGD_SUPPORTED
|
||||
png_uint_32 PNGAPI
|
||||
png_get_bKGD(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||
png_color_16p *background)
|
||||
png_color_16p *background)
|
||||
{
|
||||
if (png_ptr != NULL && info_ptr != NULL &&
|
||||
(info_ptr->valid & PNG_INFO_bKGD) != 0 &&
|
||||
@ -554,28 +554,28 @@ png_get_cHRM(png_const_structrp png_ptr, png_const_inforp info_ptr,
|
||||
|
||||
if (white_x != NULL)
|
||||
*white_x = png_float(png_ptr,
|
||||
info_ptr->colorspace.end_points_xy.whitex, "cHRM white X");
|
||||
info_ptr->colorspace.end_points_xy.whitex, "cHRM white X");
|
||||
if (white_y != NULL)
|
||||
*white_y = png_float(png_ptr,
|
||||
info_ptr->colorspace.end_points_xy.whitey, "cHRM white Y");
|
||||
info_ptr->colorspace.end_points_xy.whitey, "cHRM white Y");
|
||||
if (red_x != NULL)
|
||||
*red_x = png_float(png_ptr, info_ptr->colorspace.end_points_xy.redx,
|
||||
"cHRM red X");
|
||||
"cHRM red X");
|
||||
if (red_y != NULL)
|
||||
*red_y = png_float(png_ptr, info_ptr->colorspace.end_points_xy.redy,
|
||||
"cHRM red Y");
|
||||
"cHRM red Y");
|
||||
if (green_x != NULL)
|
||||
*green_x = png_float(png_ptr,
|
||||
info_ptr->colorspace.end_points_xy.greenx, "cHRM green X");
|
||||
info_ptr->colorspace.end_points_xy.greenx, "cHRM green X");
|
||||
if (green_y != NULL)
|
||||
*green_y = png_float(png_ptr,
|
||||
info_ptr->colorspace.end_points_xy.greeny, "cHRM green Y");
|
||||
info_ptr->colorspace.end_points_xy.greeny, "cHRM green Y");
|
||||
if (blue_x != NULL)
|
||||
*blue_x = png_float(png_ptr, info_ptr->colorspace.end_points_xy.bluex,
|
||||
"cHRM blue X");
|
||||
"cHRM blue X");
|
||||
if (blue_y != NULL)
|
||||
*blue_y = png_float(png_ptr, info_ptr->colorspace.end_points_xy.bluey,
|
||||
"cHRM blue Y");
|
||||
"cHRM blue Y");
|
||||
return (PNG_INFO_cHRM);
|
||||
}
|
||||
|
||||
@ -584,42 +584,42 @@ png_get_cHRM(png_const_structrp png_ptr, png_const_inforp info_ptr,
|
||||
|
||||
png_uint_32 PNGAPI
|
||||
png_get_cHRM_XYZ(png_const_structrp png_ptr, png_const_inforp info_ptr,
|
||||
double *red_X, double *red_Y, double *red_Z, double *green_X,
|
||||
double *green_Y, double *green_Z, double *blue_X, double *blue_Y,
|
||||
double *blue_Z)
|
||||
double *red_X, double *red_Y, double *red_Z, double *green_X,
|
||||
double *green_Y, double *green_Z, double *blue_X, double *blue_Y,
|
||||
double *blue_Z)
|
||||
{
|
||||
if (png_ptr != NULL && info_ptr != NULL &&
|
||||
(info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_ENDPOINTS) != 0)
|
||||
(info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_ENDPOINTS) != 0)
|
||||
{
|
||||
png_debug1(1, "in %s retrieval function", "cHRM_XYZ(float)");
|
||||
|
||||
if (red_X != NULL)
|
||||
*red_X = png_float(png_ptr, info_ptr->colorspace.end_points_XYZ.red_X,
|
||||
"cHRM red X");
|
||||
"cHRM red X");
|
||||
if (red_Y != NULL)
|
||||
*red_Y = png_float(png_ptr, info_ptr->colorspace.end_points_XYZ.red_Y,
|
||||
"cHRM red Y");
|
||||
"cHRM red Y");
|
||||
if (red_Z != NULL)
|
||||
*red_Z = png_float(png_ptr, info_ptr->colorspace.end_points_XYZ.red_Z,
|
||||
"cHRM red Z");
|
||||
"cHRM red Z");
|
||||
if (green_X != NULL)
|
||||
*green_X = png_float(png_ptr,
|
||||
info_ptr->colorspace.end_points_XYZ.green_X, "cHRM green X");
|
||||
info_ptr->colorspace.end_points_XYZ.green_X, "cHRM green X");
|
||||
if (green_Y != NULL)
|
||||
*green_Y = png_float(png_ptr,
|
||||
info_ptr->colorspace.end_points_XYZ.green_Y, "cHRM green Y");
|
||||
info_ptr->colorspace.end_points_XYZ.green_Y, "cHRM green Y");
|
||||
if (green_Z != NULL)
|
||||
*green_Z = png_float(png_ptr,
|
||||
info_ptr->colorspace.end_points_XYZ.green_Z, "cHRM green Z");
|
||||
info_ptr->colorspace.end_points_XYZ.green_Z, "cHRM green Z");
|
||||
if (blue_X != NULL)
|
||||
*blue_X = png_float(png_ptr,
|
||||
info_ptr->colorspace.end_points_XYZ.blue_X, "cHRM blue X");
|
||||
info_ptr->colorspace.end_points_XYZ.blue_X, "cHRM blue X");
|
||||
if (blue_Y != NULL)
|
||||
*blue_Y = png_float(png_ptr,
|
||||
info_ptr->colorspace.end_points_XYZ.blue_Y, "cHRM blue Y");
|
||||
info_ptr->colorspace.end_points_XYZ.blue_Y, "cHRM blue Y");
|
||||
if (blue_Z != NULL)
|
||||
*blue_Z = png_float(png_ptr,
|
||||
info_ptr->colorspace.end_points_XYZ.blue_Z, "cHRM blue Z");
|
||||
info_ptr->colorspace.end_points_XYZ.blue_Z, "cHRM blue Z");
|
||||
return (PNG_INFO_cHRM);
|
||||
}
|
||||
|
||||
@ -709,8 +709,8 @@ png_get_gAMA_fixed(png_const_structrp png_ptr, png_const_inforp info_ptr,
|
||||
png_debug1(1, "in %s retrieval function", "gAMA");
|
||||
|
||||
if (png_ptr != NULL && info_ptr != NULL &&
|
||||
(info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_GAMMA) != 0 &&
|
||||
file_gamma != NULL)
|
||||
(info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_GAMMA) != 0 &&
|
||||
file_gamma != NULL)
|
||||
{
|
||||
*file_gamma = info_ptr->colorspace.gamma;
|
||||
return (PNG_INFO_gAMA);
|
||||
@ -732,7 +732,7 @@ png_get_gAMA(png_const_structrp png_ptr, png_const_inforp info_ptr,
|
||||
file_gamma != NULL)
|
||||
{
|
||||
*file_gamma = png_float(png_ptr, info_ptr->colorspace.gamma,
|
||||
"png_get_gAMA");
|
||||
"png_get_gAMA");
|
||||
return (PNG_INFO_gAMA);
|
||||
}
|
||||
|
||||
@ -929,7 +929,7 @@ png_get_sCAL_fixed(png_const_structrp png_ptr, png_const_inforp info_ptr,
|
||||
*/
|
||||
*width = png_fixed(png_ptr, atof(info_ptr->scal_s_width), "sCAL width");
|
||||
*height = png_fixed(png_ptr, atof(info_ptr->scal_s_height),
|
||||
"sCAL height");
|
||||
"sCAL height");
|
||||
return (PNG_INFO_sCAL);
|
||||
}
|
||||
|
||||
|
@ -33,7 +33,7 @@
|
||||
* file and, per its terms, should not be removed:
|
||||
*/
|
||||
|
||||
/* libpng version 1.6.23, June 9, 2016 */
|
||||
/* libpng version 1.6.28, January 5, 2017 */
|
||||
|
||||
/* Copyright (c) 1998-2016 Glenn Randers-Pehrson */
|
||||
|
||||
@ -83,7 +83,7 @@
|
||||
#define PNG_READ_BGR_SUPPORTED
|
||||
#define PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED
|
||||
#define PNG_READ_COMPOSITE_NODIV_SUPPORTED
|
||||
#define PNG_READ_COMPRESSED_TEXT_SUPPORTED
|
||||
/*#undef PNG_READ_COMPRESSED_TEXT_SUPPORTED*/
|
||||
#define PNG_READ_EXPAND_16_SUPPORTED
|
||||
#define PNG_READ_EXPAND_SUPPORTED
|
||||
#define PNG_READ_FILLER_SUPPORTED
|
||||
@ -115,8 +115,8 @@
|
||||
#define PNG_READ_cHRM_SUPPORTED
|
||||
#define PNG_READ_gAMA_SUPPORTED
|
||||
#define PNG_READ_hIST_SUPPORTED
|
||||
#define PNG_READ_iCCP_SUPPORTED
|
||||
#define PNG_READ_iTXt_SUPPORTED
|
||||
/*#undef PNG_READ_iCCP_SUPPORTED*/
|
||||
/*#undef PNG_READ_iTXt_SUPPORTED*/
|
||||
#define PNG_READ_oFFs_SUPPORTED
|
||||
#define PNG_READ_pCAL_SUPPORTED
|
||||
#define PNG_READ_pHYs_SUPPORTED
|
||||
@ -127,7 +127,7 @@
|
||||
#define PNG_READ_tEXt_SUPPORTED
|
||||
#define PNG_READ_tIME_SUPPORTED
|
||||
#define PNG_READ_tRNS_SUPPORTED
|
||||
#define PNG_READ_zTXt_SUPPORTED
|
||||
/*#undef PNG_READ_zTXt_SUPPORTED*/
|
||||
/*#undef PNG_SAVE_INT_32_SUPPORTED*/
|
||||
#define PNG_SAVE_UNKNOWN_CHUNKS_SUPPORTED
|
||||
#define PNG_SEQUENTIAL_READ_SUPPORTED
|
||||
@ -231,10 +231,10 @@
|
||||
#define PNG_QUANTIZE_RED_BITS 5
|
||||
#define PNG_TEXT_Z_DEFAULT_COMPRESSION (-1)
|
||||
#define PNG_TEXT_Z_DEFAULT_STRATEGY 0
|
||||
#define PNG_USER_CHUNK_CACHE_MAX 0
|
||||
#define PNG_USER_CHUNK_MALLOC_MAX 0
|
||||
#define PNG_USER_HEIGHT_MAX 1000000
|
||||
#define PNG_USER_WIDTH_MAX 1000000
|
||||
#define PNG_USER_CHUNK_CACHE_MAX 1000
|
||||
#define PNG_USER_CHUNK_MALLOC_MAX 8000000
|
||||
#define PNG_USER_HEIGHT_MAX 8000
|
||||
#define PNG_USER_WIDTH_MAX 8000
|
||||
#define PNG_ZBUF_SIZE 8192
|
||||
#define PNG_ZLIB_VERNUM 0
|
||||
#define PNG_Z_DEFAULT_COMPRESSION (-1)
|
||||
|
@ -29,8 +29,8 @@
|
||||
* However, the following notice accompanied the original version of this
|
||||
* file and, per its terms, should not be removed:
|
||||
*
|
||||
* Last changed in libpng 1.6.15 [November 20, 2014]
|
||||
* Copyright (c) 1998-2002,2004,2006-2014 Glenn Randers-Pehrson
|
||||
* Last changed in libpng 1.6.26 [October 20, 2016]
|
||||
* Copyright (c) 1998-2002,2004,2006-2014,2016 Glenn Randers-Pehrson
|
||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||
*
|
||||
@ -94,7 +94,7 @@ png_calloc,(png_const_structrp png_ptr, png_alloc_size_t size),PNG_ALLOCATED)
|
||||
*/
|
||||
PNG_FUNCTION(png_voidp /* PRIVATE */,
|
||||
png_malloc_base,(png_const_structrp png_ptr, png_alloc_size_t size),
|
||||
PNG_ALLOCATED)
|
||||
PNG_ALLOCATED)
|
||||
{
|
||||
/* Moved to png_malloc_base from png_malloc_default in 1.6.0; the DOS
|
||||
* allocators have also been removed in 1.6.0, so any 16-bit system now has
|
||||
@ -135,9 +135,9 @@ png_malloc_base,(png_const_structrp png_ptr, png_alloc_size_t size),
|
||||
*/
|
||||
static png_voidp
|
||||
png_malloc_array_checked(png_const_structrp png_ptr, int nelements,
|
||||
size_t element_size)
|
||||
size_t element_size)
|
||||
{
|
||||
png_alloc_size_t req = nelements; /* known to be > 0 */
|
||||
png_alloc_size_t req = (png_alloc_size_t)nelements; /* known to be > 0 */
|
||||
|
||||
if (req <= PNG_SIZE_MAX/element_size)
|
||||
return png_malloc_base(png_ptr, req * element_size);
|
||||
@ -148,7 +148,7 @@ png_malloc_array_checked(png_const_structrp png_ptr, int nelements,
|
||||
|
||||
PNG_FUNCTION(png_voidp /* PRIVATE */,
|
||||
png_malloc_array,(png_const_structrp png_ptr, int nelements,
|
||||
size_t element_size),PNG_ALLOCATED)
|
||||
size_t element_size),PNG_ALLOCATED)
|
||||
{
|
||||
if (nelements <= 0 || element_size == 0)
|
||||
png_error(png_ptr, "internal error: array alloc");
|
||||
@ -158,7 +158,7 @@ png_malloc_array,(png_const_structrp png_ptr, int nelements,
|
||||
|
||||
PNG_FUNCTION(png_voidp /* PRIVATE */,
|
||||
png_realloc_array,(png_const_structrp png_ptr, png_const_voidp old_array,
|
||||
int old_elements, int add_elements, size_t element_size),PNG_ALLOCATED)
|
||||
int old_elements, int add_elements, size_t element_size),PNG_ALLOCATED)
|
||||
{
|
||||
/* These are internal errors: */
|
||||
if (add_elements <= 0 || element_size == 0 || old_elements < 0 ||
|
||||
@ -171,7 +171,7 @@ png_realloc_array,(png_const_structrp png_ptr, png_const_voidp old_array,
|
||||
if (add_elements <= INT_MAX - old_elements)
|
||||
{
|
||||
png_voidp new_array = png_malloc_array_checked(png_ptr,
|
||||
old_elements+add_elements, element_size);
|
||||
old_elements+add_elements, element_size);
|
||||
|
||||
if (new_array != NULL)
|
||||
{
|
||||
@ -182,7 +182,7 @@ png_realloc_array,(png_const_structrp png_ptr, png_const_voidp old_array,
|
||||
memcpy(new_array, old_array, element_size*(unsigned)old_elements);
|
||||
|
||||
memset((char*)new_array + element_size*(unsigned)old_elements, 0,
|
||||
element_size*(unsigned)add_elements);
|
||||
element_size*(unsigned)add_elements);
|
||||
|
||||
return new_array;
|
||||
}
|
||||
@ -215,7 +215,7 @@ png_malloc,(png_const_structrp png_ptr, png_alloc_size_t size),PNG_ALLOCATED)
|
||||
#ifdef PNG_USER_MEM_SUPPORTED
|
||||
PNG_FUNCTION(png_voidp,PNGAPI
|
||||
png_malloc_default,(png_const_structrp png_ptr, png_alloc_size_t size),
|
||||
PNG_ALLOCATED PNG_DEPRECATED)
|
||||
PNG_ALLOCATED PNG_DEPRECATED)
|
||||
{
|
||||
png_voidp ret;
|
||||
|
||||
@ -238,7 +238,7 @@ png_malloc_default,(png_const_structrp png_ptr, png_alloc_size_t size),
|
||||
*/
|
||||
PNG_FUNCTION(png_voidp,PNGAPI
|
||||
png_malloc_warn,(png_const_structrp png_ptr, png_alloc_size_t size),
|
||||
PNG_ALLOCATED)
|
||||
PNG_ALLOCATED)
|
||||
{
|
||||
if (png_ptr != NULL)
|
||||
{
|
||||
|
@ -29,7 +29,7 @@
|
||||
* However, the following notice accompanied the original version of this
|
||||
* file and, per its terms, should not be removed:
|
||||
*
|
||||
* Last changed in libpng 1.6.23 [June 9, 2016]
|
||||
* Last changed in libpng 1.6.24 [August 4, 2016]
|
||||
* Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson
|
||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||
@ -105,11 +105,11 @@ png_process_data_pause(png_structrp png_ptr, int save)
|
||||
png_uint_32 PNGAPI
|
||||
png_process_data_skip(png_structrp png_ptr)
|
||||
{
|
||||
/* TODO: Deprecate and remove this API.
|
||||
* Somewhere the implementation of this seems to have been lost,
|
||||
* or abandoned. It was only to support some internal back-door access
|
||||
* to png_struct) in libpng-1.4.x.
|
||||
*/
|
||||
/* TODO: Deprecate and remove this API.
|
||||
* Somewhere the implementation of this seems to have been lost,
|
||||
* or abandoned. It was only to support some internal back-door access
|
||||
* to png_struct) in libpng-1.4.x.
|
||||
*/
|
||||
png_app_warning(png_ptr,
|
||||
"png_process_data_skip is not implemented in any current version of libpng");
|
||||
return 0;
|
||||
@ -438,7 +438,7 @@ png_push_read_chunk(png_structrp png_ptr, png_inforp info_ptr)
|
||||
{
|
||||
PNG_PUSH_SAVE_BUFFER_IF_FULL
|
||||
png_handle_unknown(png_ptr, info_ptr, png_ptr->push_length,
|
||||
PNG_HANDLE_CHUNK_AS_DEFAULT);
|
||||
PNG_HANDLE_CHUNK_AS_DEFAULT);
|
||||
}
|
||||
|
||||
png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER;
|
||||
@ -549,7 +549,7 @@ png_push_save_buffer(png_structrp png_ptr)
|
||||
|
||||
void /* PRIVATE */
|
||||
png_push_restore_buffer(png_structrp png_ptr, png_bytep buffer,
|
||||
png_size_t buffer_length)
|
||||
png_size_t buffer_length)
|
||||
{
|
||||
png_ptr->current_buffer = buffer;
|
||||
png_ptr->current_buffer_size = buffer_length;
|
||||
@ -652,7 +652,7 @@ png_push_read_IDAT(png_structrp png_ptr)
|
||||
|
||||
void /* PRIVATE */
|
||||
png_process_IDAT_data(png_structrp png_ptr, png_bytep buffer,
|
||||
png_size_t buffer_length)
|
||||
png_size_t buffer_length)
|
||||
{
|
||||
/* The caller checks for a non-zero buffer length. */
|
||||
if (!(buffer_length > 0) || buffer == NULL)
|
||||
@ -712,7 +712,12 @@ png_process_IDAT_data(png_structrp png_ptr, png_bytep buffer,
|
||||
png_warning(png_ptr, "Truncated compressed data in IDAT");
|
||||
|
||||
else
|
||||
png_error(png_ptr, "Decompression error in IDAT");
|
||||
{
|
||||
if (ret == Z_DATA_ERROR)
|
||||
png_benign_error(png_ptr, "IDAT: ADLER32 checksum mismatch");
|
||||
else
|
||||
png_error(png_ptr, "Decompression error in IDAT");
|
||||
}
|
||||
|
||||
/* Skip the check on unprocessed input */
|
||||
return;
|
||||
@ -810,7 +815,7 @@ png_push_process_row(png_structrp png_ptr)
|
||||
{
|
||||
if (png_ptr->pass < 6)
|
||||
png_do_read_interlace(&row_info, png_ptr->row_buf + 1, png_ptr->pass,
|
||||
png_ptr->transformations);
|
||||
png_ptr->transformations);
|
||||
|
||||
switch (png_ptr->pass)
|
||||
{
|
||||
@ -1072,7 +1077,7 @@ png_push_have_row(png_structrp png_ptr, png_bytep row)
|
||||
{
|
||||
if (png_ptr->row_fn != NULL)
|
||||
(*(png_ptr->row_fn))(png_ptr, row, png_ptr->row_number,
|
||||
(int)png_ptr->pass);
|
||||
(int)png_ptr->pass);
|
||||
}
|
||||
|
||||
#ifdef PNG_READ_INTERLACING_SUPPORTED
|
||||
|
@ -29,7 +29,7 @@
|
||||
* However, the following notice accompanied the original version of this
|
||||
* file and, per its terms, should not be removed:
|
||||
*
|
||||
* Last changed in libpng 1.6.22 [May 26, 2016]
|
||||
* Last changed in libpng 1.6.26 [October 20, 2016]
|
||||
* Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson
|
||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||
@ -210,6 +210,35 @@
|
||||
# endif
|
||||
#endif /* PNG_ARM_NEON_OPT > 0 */
|
||||
|
||||
#ifndef PNG_MIPS_MSA_OPT
|
||||
# if defined(__mips_msa) && (__mips_isa_rev >= 5) && defined(PNG_ALIGNED_MEMORY_SUPPORTED)
|
||||
# define PNG_MIPS_MSA_OPT 2
|
||||
# else
|
||||
# define PNG_MIPS_MSA_OPT 0
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if PNG_MIPS_MSA_OPT > 0
|
||||
# define PNG_FILTER_OPTIMIZATIONS png_init_filter_functions_msa
|
||||
# ifndef PNG_MIPS_MSA_IMPLEMENTATION
|
||||
# if defined(__mips_msa)
|
||||
# if defined(__clang__)
|
||||
# elif defined(__GNUC__)
|
||||
# if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 7)
|
||||
# define PNG_MIPS_MSA_IMPLEMENTATION 2
|
||||
# endif /* no GNUC support */
|
||||
# endif /* __GNUC__ */
|
||||
# else /* !defined __mips_msa */
|
||||
# define PNG_MIPS_MSA_IMPLEMENTATION 2
|
||||
# endif /* __mips_msa */
|
||||
# endif /* !PNG_MIPS_MSA_IMPLEMENTATION */
|
||||
|
||||
# ifndef PNG_MIPS_MSA_IMPLEMENTATION
|
||||
# define PNG_MIPS_MSA_IMPLEMENTATION 1
|
||||
# endif
|
||||
#endif /* PNG_MIPS_MSA_OPT > 0 */
|
||||
|
||||
|
||||
/* Is this a build of a DLL where compilation of the object modules requires
|
||||
* different preprocessor settings to those required for a simple library? If
|
||||
* so PNG_BUILD_DLL must be set.
|
||||
@ -448,10 +477,10 @@
|
||||
|
||||
# if (defined(__MWERKS__) && defined(macintosh)) || defined(applec) || \
|
||||
defined(THINK_C) || defined(__SC__) || defined(TARGET_OS_MAC)
|
||||
/* We need to check that <math.h> hasn't already been included earlier
|
||||
* as it seems it doesn't agree with <fp.h>, yet we should really use
|
||||
* <fp.h> if possible.
|
||||
*/
|
||||
/* We need to check that <math.h> hasn't already been included earlier
|
||||
* as it seems it doesn't agree with <fp.h>, yet we should really use
|
||||
* <fp.h> if possible.
|
||||
*/
|
||||
# if !defined(__MATH_H__) && !defined(__MATH_H) && !defined(__cmath__)
|
||||
# include <fp.h>
|
||||
# endif
|
||||
@ -459,9 +488,9 @@
|
||||
# include <math.h>
|
||||
# endif
|
||||
# if defined(_AMIGA) && defined(__SASC) && defined(_M68881)
|
||||
/* Amiga SAS/C: We must include builtin FPU functions when compiling using
|
||||
* MATH=68881
|
||||
*/
|
||||
/* Amiga SAS/C: We must include builtin FPU functions when compiling using
|
||||
* MATH=68881
|
||||
*/
|
||||
# include <m68881.h>
|
||||
# endif
|
||||
#endif
|
||||
@ -532,7 +561,8 @@
|
||||
/* This implicitly assumes alignment is always to a power of 2. */
|
||||
#ifdef png_alignof
|
||||
# define png_isaligned(ptr, type)\
|
||||
((((const char*)ptr-(const char*)0) & (png_alignof(type)-1)) == 0)
|
||||
(((type)((const char*)ptr-(const char*)0) & \
|
||||
(type)(png_alignof(type)-1)) == 0)
|
||||
#else
|
||||
# define png_isaligned(ptr, type) 0
|
||||
#endif
|
||||
@ -549,92 +579,92 @@
|
||||
* are defined in png.h because they need to be visible to applications
|
||||
* that call png_set_unknown_chunk().
|
||||
*/
|
||||
/* #define PNG_HAVE_IHDR 0x01 (defined in png.h) */
|
||||
/* #define PNG_HAVE_PLTE 0x02 (defined in png.h) */
|
||||
#define PNG_HAVE_IDAT 0x04
|
||||
/* #define PNG_AFTER_IDAT 0x08 (defined in png.h) */
|
||||
#define PNG_HAVE_IEND 0x10
|
||||
/* 0x20 (unused) */
|
||||
/* 0x40 (unused) */
|
||||
/* 0x80 (unused) */
|
||||
#define PNG_HAVE_CHUNK_HEADER 0x100
|
||||
#define PNG_WROTE_tIME 0x200
|
||||
#define PNG_WROTE_INFO_BEFORE_PLTE 0x400
|
||||
#define PNG_BACKGROUND_IS_GRAY 0x800
|
||||
#define PNG_HAVE_PNG_SIGNATURE 0x1000
|
||||
#define PNG_HAVE_CHUNK_AFTER_IDAT 0x2000 /* Have another chunk after IDAT */
|
||||
/* 0x4000 (unused) */
|
||||
#define PNG_IS_READ_STRUCT 0x8000 /* Else is a write struct */
|
||||
/* #define PNG_HAVE_IHDR 0x01U (defined in png.h) */
|
||||
/* #define PNG_HAVE_PLTE 0x02U (defined in png.h) */
|
||||
#define PNG_HAVE_IDAT 0x04U
|
||||
/* #define PNG_AFTER_IDAT 0x08U (defined in png.h) */
|
||||
#define PNG_HAVE_IEND 0x10U
|
||||
/* 0x20U (unused) */
|
||||
/* 0x40U (unused) */
|
||||
/* 0x80U (unused) */
|
||||
#define PNG_HAVE_CHUNK_HEADER 0x100U
|
||||
#define PNG_WROTE_tIME 0x200U
|
||||
#define PNG_WROTE_INFO_BEFORE_PLTE 0x400U
|
||||
#define PNG_BACKGROUND_IS_GRAY 0x800U
|
||||
#define PNG_HAVE_PNG_SIGNATURE 0x1000U
|
||||
#define PNG_HAVE_CHUNK_AFTER_IDAT 0x2000U /* Have another chunk after IDAT */
|
||||
/* 0x4000U (unused) */
|
||||
#define PNG_IS_READ_STRUCT 0x8000U /* Else is a write struct */
|
||||
|
||||
/* Flags for the transformations the PNG library does on the image data */
|
||||
#define PNG_BGR 0x0001
|
||||
#define PNG_INTERLACE 0x0002
|
||||
#define PNG_PACK 0x0004
|
||||
#define PNG_SHIFT 0x0008
|
||||
#define PNG_SWAP_BYTES 0x0010
|
||||
#define PNG_INVERT_MONO 0x0020
|
||||
#define PNG_QUANTIZE 0x0040
|
||||
#define PNG_COMPOSE 0x0080 /* Was PNG_BACKGROUND */
|
||||
#define PNG_BACKGROUND_EXPAND 0x0100
|
||||
#define PNG_EXPAND_16 0x0200 /* Added to libpng 1.5.2 */
|
||||
#define PNG_16_TO_8 0x0400 /* Becomes 'chop' in 1.5.4 */
|
||||
#define PNG_RGBA 0x0800
|
||||
#define PNG_EXPAND 0x1000
|
||||
#define PNG_GAMMA 0x2000
|
||||
#define PNG_GRAY_TO_RGB 0x4000
|
||||
#define PNG_FILLER 0x8000
|
||||
#define PNG_PACKSWAP 0x10000
|
||||
#define PNG_SWAP_ALPHA 0x20000
|
||||
#define PNG_STRIP_ALPHA 0x40000
|
||||
#define PNG_INVERT_ALPHA 0x80000
|
||||
#define PNG_USER_TRANSFORM 0x100000
|
||||
#define PNG_RGB_TO_GRAY_ERR 0x200000
|
||||
#define PNG_RGB_TO_GRAY_WARN 0x400000
|
||||
#define PNG_RGB_TO_GRAY 0x600000 /* two bits, RGB_TO_GRAY_ERR|WARN */
|
||||
#define PNG_ENCODE_ALPHA 0x800000 /* Added to libpng-1.5.4 */
|
||||
#define PNG_ADD_ALPHA 0x1000000 /* Added to libpng-1.2.7 */
|
||||
#define PNG_EXPAND_tRNS 0x2000000 /* Added to libpng-1.2.9 */
|
||||
#define PNG_SCALE_16_TO_8 0x4000000 /* Added to libpng-1.5.4 */
|
||||
/* 0x8000000 unused */
|
||||
/* 0x10000000 unused */
|
||||
/* 0x20000000 unused */
|
||||
/* 0x40000000 unused */
|
||||
#define PNG_BGR 0x0001U
|
||||
#define PNG_INTERLACE 0x0002U
|
||||
#define PNG_PACK 0x0004U
|
||||
#define PNG_SHIFT 0x0008U
|
||||
#define PNG_SWAP_BYTES 0x0010U
|
||||
#define PNG_INVERT_MONO 0x0020U
|
||||
#define PNG_QUANTIZE 0x0040U
|
||||
#define PNG_COMPOSE 0x0080U /* Was PNG_BACKGROUND */
|
||||
#define PNG_BACKGROUND_EXPAND 0x0100U
|
||||
#define PNG_EXPAND_16 0x0200U /* Added to libpng 1.5.2 */
|
||||
#define PNG_16_TO_8 0x0400U /* Becomes 'chop' in 1.5.4 */
|
||||
#define PNG_RGBA 0x0800U
|
||||
#define PNG_EXPAND 0x1000U
|
||||
#define PNG_GAMMA 0x2000U
|
||||
#define PNG_GRAY_TO_RGB 0x4000U
|
||||
#define PNG_FILLER 0x8000U
|
||||
#define PNG_PACKSWAP 0x10000U
|
||||
#define PNG_SWAP_ALPHA 0x20000U
|
||||
#define PNG_STRIP_ALPHA 0x40000U
|
||||
#define PNG_INVERT_ALPHA 0x80000U
|
||||
#define PNG_USER_TRANSFORM 0x100000U
|
||||
#define PNG_RGB_TO_GRAY_ERR 0x200000U
|
||||
#define PNG_RGB_TO_GRAY_WARN 0x400000U
|
||||
#define PNG_RGB_TO_GRAY 0x600000U /* two bits, RGB_TO_GRAY_ERR|WARN */
|
||||
#define PNG_ENCODE_ALPHA 0x800000U /* Added to libpng-1.5.4 */
|
||||
#define PNG_ADD_ALPHA 0x1000000U /* Added to libpng-1.2.7 */
|
||||
#define PNG_EXPAND_tRNS 0x2000000U /* Added to libpng-1.2.9 */
|
||||
#define PNG_SCALE_16_TO_8 0x4000000U /* Added to libpng-1.5.4 */
|
||||
/* 0x8000000U unused */
|
||||
/* 0x10000000U unused */
|
||||
/* 0x20000000U unused */
|
||||
/* 0x40000000U unused */
|
||||
/* Flags for png_create_struct */
|
||||
#define PNG_STRUCT_PNG 0x0001
|
||||
#define PNG_STRUCT_INFO 0x0002
|
||||
#define PNG_STRUCT_PNG 0x0001U
|
||||
#define PNG_STRUCT_INFO 0x0002U
|
||||
|
||||
/* Flags for the png_ptr->flags rather than declaring a byte for each one */
|
||||
#define PNG_FLAG_ZLIB_CUSTOM_STRATEGY 0x0001
|
||||
#define PNG_FLAG_ZSTREAM_INITIALIZED 0x0002 /* Added to libpng-1.6.0 */
|
||||
/* 0x0004 unused */
|
||||
#define PNG_FLAG_ZSTREAM_ENDED 0x0008 /* Added to libpng-1.6.0 */
|
||||
/* 0x0010 unused */
|
||||
/* 0x0020 unused */
|
||||
#define PNG_FLAG_ROW_INIT 0x0040
|
||||
#define PNG_FLAG_FILLER_AFTER 0x0080
|
||||
#define PNG_FLAG_CRC_ANCILLARY_USE 0x0100
|
||||
#define PNG_FLAG_CRC_ANCILLARY_NOWARN 0x0200
|
||||
#define PNG_FLAG_CRC_CRITICAL_USE 0x0400
|
||||
#define PNG_FLAG_CRC_CRITICAL_IGNORE 0x0800
|
||||
#define PNG_FLAG_ASSUME_sRGB 0x1000 /* Added to libpng-1.5.4 */
|
||||
#define PNG_FLAG_OPTIMIZE_ALPHA 0x2000 /* Added to libpng-1.5.4 */
|
||||
#define PNG_FLAG_DETECT_UNINITIALIZED 0x4000 /* Added to libpng-1.5.4 */
|
||||
/* #define PNG_FLAG_KEEP_UNKNOWN_CHUNKS 0x8000 */
|
||||
/* #define PNG_FLAG_KEEP_UNSAFE_CHUNKS 0x10000 */
|
||||
#define PNG_FLAG_LIBRARY_MISMATCH 0x20000
|
||||
#define PNG_FLAG_STRIP_ERROR_NUMBERS 0x40000
|
||||
#define PNG_FLAG_STRIP_ERROR_TEXT 0x80000
|
||||
#define PNG_FLAG_BENIGN_ERRORS_WARN 0x100000 /* Added to libpng-1.4.0 */
|
||||
#define PNG_FLAG_APP_WARNINGS_WARN 0x200000 /* Added to libpng-1.6.0 */
|
||||
#define PNG_FLAG_APP_ERRORS_WARN 0x400000 /* Added to libpng-1.6.0 */
|
||||
/* 0x800000 unused */
|
||||
/* 0x1000000 unused */
|
||||
/* 0x2000000 unused */
|
||||
/* 0x4000000 unused */
|
||||
/* 0x8000000 unused */
|
||||
/* 0x10000000 unused */
|
||||
/* 0x20000000 unused */
|
||||
/* 0x40000000 unused */
|
||||
#define PNG_FLAG_ZLIB_CUSTOM_STRATEGY 0x0001U
|
||||
#define PNG_FLAG_ZSTREAM_INITIALIZED 0x0002U /* Added to libpng-1.6.0 */
|
||||
/* 0x0004U unused */
|
||||
#define PNG_FLAG_ZSTREAM_ENDED 0x0008U /* Added to libpng-1.6.0 */
|
||||
/* 0x0010U unused */
|
||||
/* 0x0020U unused */
|
||||
#define PNG_FLAG_ROW_INIT 0x0040U
|
||||
#define PNG_FLAG_FILLER_AFTER 0x0080U
|
||||
#define PNG_FLAG_CRC_ANCILLARY_USE 0x0100U
|
||||
#define PNG_FLAG_CRC_ANCILLARY_NOWARN 0x0200U
|
||||
#define PNG_FLAG_CRC_CRITICAL_USE 0x0400U
|
||||
#define PNG_FLAG_CRC_CRITICAL_IGNORE 0x0800U
|
||||
#define PNG_FLAG_ASSUME_sRGB 0x1000U /* Added to libpng-1.5.4 */
|
||||
#define PNG_FLAG_OPTIMIZE_ALPHA 0x2000U /* Added to libpng-1.5.4 */
|
||||
#define PNG_FLAG_DETECT_UNINITIALIZED 0x4000U /* Added to libpng-1.5.4 */
|
||||
/* #define PNG_FLAG_KEEP_UNKNOWN_CHUNKS 0x8000U */
|
||||
/* #define PNG_FLAG_KEEP_UNSAFE_CHUNKS 0x10000U */
|
||||
#define PNG_FLAG_LIBRARY_MISMATCH 0x20000U
|
||||
#define PNG_FLAG_STRIP_ERROR_NUMBERS 0x40000U
|
||||
#define PNG_FLAG_STRIP_ERROR_TEXT 0x80000U
|
||||
#define PNG_FLAG_BENIGN_ERRORS_WARN 0x100000U /* Added to libpng-1.4.0 */
|
||||
#define PNG_FLAG_APP_WARNINGS_WARN 0x200000U /* Added to libpng-1.6.0 */
|
||||
#define PNG_FLAG_APP_ERRORS_WARN 0x400000U /* Added to libpng-1.6.0 */
|
||||
/* 0x800000U unused */
|
||||
/* 0x1000000U unused */
|
||||
/* 0x2000000U unused */
|
||||
/* 0x4000000U unused */
|
||||
/* 0x8000000U unused */
|
||||
/* 0x10000000U unused */
|
||||
/* 0x20000000U unused */
|
||||
/* 0x40000000U unused */
|
||||
|
||||
#define PNG_FLAG_CRC_ANCILLARY_MASK (PNG_FLAG_CRC_ANCILLARY_USE | \
|
||||
PNG_FLAG_CRC_ANCILLARY_NOWARN)
|
||||
@ -668,6 +698,24 @@
|
||||
((png_size_t)(width) * (((png_size_t)(pixel_bits)) >> 3)) : \
|
||||
(( ((png_size_t)(width) * ((png_size_t)(pixel_bits))) + 7) >> 3) )
|
||||
|
||||
/* This returns the number of trailing bits in the last byte of a row, 0 if the
|
||||
* last byte is completely full of pixels. It is, in principle, (pixel_bits x
|
||||
* width) % 8, but that would overflow for large 'width'. The second macro is
|
||||
* the same except that it returns the number of unused bits in the last byte;
|
||||
* (8-TRAILBITS), but 0 when TRAILBITS is 0.
|
||||
*
|
||||
* NOTE: these macros are intended to be self-evidently correct and never
|
||||
* overflow on the assumption that pixel_bits is in the range 0..255. The
|
||||
* arguments are evaluated only once and they can be signed (e.g. as a result of
|
||||
* the integral promotions). The result of the expression always has type
|
||||
* (png_uint_32), however the compiler always knows it is in the range 0..7.
|
||||
*/
|
||||
#define PNG_TRAILBITS(pixel_bits, width) \
|
||||
(((pixel_bits) * ((width) % (png_uint_32)8)) % 8)
|
||||
|
||||
#define PNG_PADBITS(pixel_bits, width) \
|
||||
((8 - PNG_TRAILBITS(pixel_bits, width)) % 8)
|
||||
|
||||
/* PNG_OUT_OF_RANGE returns true if value is outside the range
|
||||
* ideal-delta..ideal+delta. Each argument is evaluated twice.
|
||||
* "ideal" and "delta" should be constants, normally simple
|
||||
@ -1053,7 +1101,7 @@ PNG_INTERNAL_FUNCTION(void,png_write_sBIT,(png_structrp png_ptr,
|
||||
#ifdef PNG_WRITE_cHRM_SUPPORTED
|
||||
PNG_INTERNAL_FUNCTION(void,png_write_cHRM_fixed,(png_structrp png_ptr,
|
||||
const png_xy *xy), PNG_EMPTY);
|
||||
/* The xy value must have been previously validated */
|
||||
/* The xy value must have been previously validated */
|
||||
#endif
|
||||
|
||||
#ifdef PNG_WRITE_sRGB_SUPPORTED
|
||||
@ -1202,6 +1250,7 @@ PNG_INTERNAL_FUNCTION(void,png_do_write_interlace,(png_row_infop row_info,
|
||||
PNG_INTERNAL_FUNCTION(void,png_read_filter_row,(png_structrp pp, png_row_infop
|
||||
row_info, png_bytep row, png_const_bytep prev_row, int filter),PNG_EMPTY);
|
||||
|
||||
#if PNG_ARM_NEON_OPT > 0
|
||||
PNG_INTERNAL_FUNCTION(void,png_read_filter_row_up_neon,(png_row_infop row_info,
|
||||
png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
|
||||
PNG_INTERNAL_FUNCTION(void,png_read_filter_row_sub3_neon,(png_row_infop
|
||||
@ -1216,6 +1265,24 @@ PNG_INTERNAL_FUNCTION(void,png_read_filter_row_paeth3_neon,(png_row_infop
|
||||
row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
|
||||
PNG_INTERNAL_FUNCTION(void,png_read_filter_row_paeth4_neon,(png_row_infop
|
||||
row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
|
||||
#endif
|
||||
|
||||
#if PNG_MIPS_MSA_OPT > 0
|
||||
PNG_INTERNAL_FUNCTION(void,png_read_filter_row_up_msa,(png_row_infop row_info,
|
||||
png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
|
||||
PNG_INTERNAL_FUNCTION(void,png_read_filter_row_sub3_msa,(png_row_infop
|
||||
row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
|
||||
PNG_INTERNAL_FUNCTION(void,png_read_filter_row_sub4_msa,(png_row_infop
|
||||
row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
|
||||
PNG_INTERNAL_FUNCTION(void,png_read_filter_row_avg3_msa,(png_row_infop
|
||||
row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
|
||||
PNG_INTERNAL_FUNCTION(void,png_read_filter_row_avg4_msa,(png_row_infop
|
||||
row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
|
||||
PNG_INTERNAL_FUNCTION(void,png_read_filter_row_paeth3_msa,(png_row_infop
|
||||
row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
|
||||
PNG_INTERNAL_FUNCTION(void,png_read_filter_row_paeth4_msa,(png_row_infop
|
||||
row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
|
||||
#endif
|
||||
|
||||
/* Choose the best filter to use and filter the row data */
|
||||
PNG_INTERNAL_FUNCTION(void,png_write_find_filter,(png_structrp png_ptr,
|
||||
@ -1243,7 +1310,7 @@ PNG_INTERNAL_FUNCTION(void,png_read_finish_row,(png_structrp png_ptr),
|
||||
/* Initialize the row buffers, etc. */
|
||||
PNG_INTERNAL_FUNCTION(void,png_read_start_row,(png_structrp png_ptr),PNG_EMPTY);
|
||||
|
||||
#if PNG_ZLIB_VERNUM >= 0x1240
|
||||
#if ZLIB_VERNUM >= 0x1240
|
||||
PNG_INTERNAL_FUNCTION(int,png_zlib_inflate,(png_structrp png_ptr, int flush),
|
||||
PNG_EMPTY);
|
||||
# define PNG_INFLATE(pp, flush) png_zlib_inflate(pp, flush)
|
||||
@ -1441,7 +1508,7 @@ PNG_INTERNAL_FUNCTION(void,png_push_have_info,(png_structrp png_ptr,
|
||||
PNG_INTERNAL_FUNCTION(void,png_push_have_end,(png_structrp png_ptr,
|
||||
png_inforp info_ptr),PNG_EMPTY);
|
||||
PNG_INTERNAL_FUNCTION(void,png_push_have_row,(png_structrp png_ptr,
|
||||
png_bytep row),PNG_EMPTY);
|
||||
png_bytep row),PNG_EMPTY);
|
||||
PNG_INTERNAL_FUNCTION(void,png_push_read_end,(png_structrp png_ptr,
|
||||
png_inforp info_ptr),PNG_EMPTY);
|
||||
PNG_INTERNAL_FUNCTION(void,png_process_some_data,(png_structrp png_ptr,
|
||||
@ -1480,13 +1547,13 @@ PNG_INTERNAL_FUNCTION(void,png_colorspace_set_gamma,(png_const_structrp png_ptr,
|
||||
|
||||
PNG_INTERNAL_FUNCTION(void,png_colorspace_sync_info,(png_const_structrp png_ptr,
|
||||
png_inforp info_ptr), PNG_EMPTY);
|
||||
/* Synchronize the info 'valid' flags with the colorspace */
|
||||
/* Synchronize the info 'valid' flags with the colorspace */
|
||||
|
||||
PNG_INTERNAL_FUNCTION(void,png_colorspace_sync,(png_const_structrp png_ptr,
|
||||
png_inforp info_ptr), PNG_EMPTY);
|
||||
/* Copy the png_struct colorspace to the info_struct and call the above to
|
||||
* synchronize the flags. Checks for NULL info_ptr and does nothing.
|
||||
*/
|
||||
/* Copy the png_struct colorspace to the info_struct and call the above to
|
||||
* synchronize the flags. Checks for NULL info_ptr and does nothing.
|
||||
*/
|
||||
#endif
|
||||
|
||||
/* Added at libpng version 1.4.0 */
|
||||
@ -1520,9 +1587,11 @@ PNG_INTERNAL_FUNCTION(int,png_colorspace_set_ICC,(png_const_structrp png_ptr,
|
||||
/* The 'name' is used for information only */
|
||||
|
||||
/* Routines for checking parts of an ICC profile. */
|
||||
#ifdef PNG_READ_iCCP_SUPPORTED
|
||||
PNG_INTERNAL_FUNCTION(int,png_icc_check_length,(png_const_structrp png_ptr,
|
||||
png_colorspacerp colorspace, png_const_charp name,
|
||||
png_uint_32 profile_length), PNG_EMPTY);
|
||||
#endif /* READ_iCCP */
|
||||
PNG_INTERNAL_FUNCTION(int,png_icc_check_header,(png_const_structrp png_ptr,
|
||||
png_colorspacerp colorspace, png_const_charp name,
|
||||
png_uint_32 profile_length,
|
||||
@ -1941,10 +2010,17 @@ PNG_INTERNAL_FUNCTION(void, PNG_FILTER_OPTIMIZATIONS, (png_structp png_ptr,
|
||||
* the builder of libpng passes the definition of PNG_FILTER_OPTIMIZATIONS in
|
||||
* CFLAGS in place of CPPFLAGS *and* uses symbol prefixing.
|
||||
*/
|
||||
# if PNG_ARM_NEON_OPT > 0
|
||||
PNG_INTERNAL_FUNCTION(void, png_init_filter_functions_neon,
|
||||
(png_structp png_ptr, unsigned int bpp), PNG_EMPTY);
|
||||
#endif
|
||||
|
||||
#if PNG_MIPS_MSA_OPT > 0
|
||||
PNG_INTERNAL_FUNCTION(void, png_init_filter_functions_msa,
|
||||
(png_structp png_ptr, unsigned int bpp), PNG_EMPTY);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
PNG_INTERNAL_FUNCTION(png_uint_32, png_check_keyword, (png_structrp png_ptr,
|
||||
png_const_charp key, png_bytep new_key), PNG_EMPTY);
|
||||
|
||||
|
@ -29,7 +29,7 @@
|
||||
* However, the following notice accompanied the original version of this
|
||||
* file and, per its terms, should not be removed:
|
||||
*
|
||||
* Last changed in libpng 1.6.23 [June 9, 2016]
|
||||
* Last changed in libpng 1.6.26 [October 20, 2016]
|
||||
* Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson
|
||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||
@ -56,10 +56,10 @@ png_create_read_struct,(png_const_charp user_png_ver, png_voidp error_ptr,
|
||||
{
|
||||
#ifndef PNG_USER_MEM_SUPPORTED
|
||||
png_structp png_ptr = png_create_png_struct(user_png_ver, error_ptr,
|
||||
error_fn, warn_fn, NULL, NULL, NULL);
|
||||
error_fn, warn_fn, NULL, NULL, NULL);
|
||||
#else
|
||||
return png_create_read_struct_2(user_png_ver, error_ptr, error_fn,
|
||||
warn_fn, NULL, NULL, NULL);
|
||||
warn_fn, NULL, NULL, NULL);
|
||||
}
|
||||
|
||||
/* Alternate create PNG structure for reading, and allocate any memory
|
||||
@ -71,7 +71,7 @@ png_create_read_struct_2,(png_const_charp user_png_ver, png_voidp error_ptr,
|
||||
png_malloc_ptr malloc_fn, png_free_ptr free_fn),PNG_ALLOCATED)
|
||||
{
|
||||
png_structp png_ptr = png_create_png_struct(user_png_ver, error_ptr,
|
||||
error_fn, warn_fn, mem_ptr, malloc_fn, free_fn);
|
||||
error_fn, warn_fn, mem_ptr, malloc_fn, free_fn);
|
||||
#endif /* USER_MEM */
|
||||
|
||||
if (png_ptr != NULL)
|
||||
@ -280,7 +280,7 @@ png_read_info(png_structrp png_ptr, png_inforp info_ptr)
|
||||
|
||||
else
|
||||
png_handle_unknown(png_ptr, info_ptr, length,
|
||||
PNG_HANDLE_CHUNK_AS_DEFAULT);
|
||||
PNG_HANDLE_CHUNK_AS_DEFAULT);
|
||||
}
|
||||
}
|
||||
#endif /* SEQUENTIAL_READ */
|
||||
@ -307,7 +307,7 @@ png_read_update_info(png_structrp png_ptr, png_inforp info_ptr)
|
||||
/* New in 1.6.0 this avoids the bug of doing the initializations twice */
|
||||
else
|
||||
png_app_error(png_ptr,
|
||||
"png_read_update_info/png_start_read_image: duplicate call");
|
||||
"png_read_update_info/png_start_read_image: duplicate call");
|
||||
}
|
||||
}
|
||||
|
||||
@ -330,7 +330,7 @@ png_start_read_image(png_structrp png_ptr)
|
||||
/* New in 1.6.0 this avoids the bug of doing the initializations twice */
|
||||
else
|
||||
png_app_error(png_ptr,
|
||||
"png_start_read_image/png_read_update_info: duplicate call");
|
||||
"png_start_read_image/png_read_update_info: duplicate call");
|
||||
}
|
||||
}
|
||||
#endif /* SEQUENTIAL_READ */
|
||||
@ -387,9 +387,9 @@ png_do_read_intrapixel(png_row_infop row_info, png_bytep row)
|
||||
|
||||
for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel)
|
||||
{
|
||||
png_uint_32 s0 = (*(rp ) << 8) | *(rp + 1);
|
||||
png_uint_32 s1 = (*(rp + 2) << 8) | *(rp + 3);
|
||||
png_uint_32 s2 = (*(rp + 4) << 8) | *(rp + 5);
|
||||
png_uint_32 s0 = (png_uint_32)(*(rp ) << 8) | *(rp + 1);
|
||||
png_uint_32 s1 = (png_uint_32)(*(rp + 2) << 8) | *(rp + 3);
|
||||
png_uint_32 s2 = (png_uint_32)(*(rp + 4) << 8) | *(rp + 5);
|
||||
png_uint_32 red = (s0 + s1 + 65536) & 0xffff;
|
||||
png_uint_32 blue = (s2 + s1 + 65536) & 0xffff;
|
||||
*(rp ) = (png_byte)((red >> 8) & 0xff);
|
||||
@ -568,7 +568,7 @@ png_read_row(png_structrp png_ptr, png_bytep row, png_bytep dsp_row)
|
||||
{
|
||||
if (png_ptr->row_buf[0] < PNG_FILTER_VALUE_LAST)
|
||||
png_read_filter_row(png_ptr, &row_info, png_ptr->row_buf + 1,
|
||||
png_ptr->prev_row + 1, png_ptr->row_buf[0]);
|
||||
png_ptr->prev_row + 1, png_ptr->row_buf[0]);
|
||||
else
|
||||
png_error(png_ptr, "bad adaptive filter value");
|
||||
}
|
||||
@ -612,7 +612,7 @@ png_read_row(png_structrp png_ptr, png_bytep row, png_bytep dsp_row)
|
||||
{
|
||||
if (png_ptr->pass < 6)
|
||||
png_do_read_interlace(&row_info, png_ptr->row_buf + 1, png_ptr->pass,
|
||||
png_ptr->transformations);
|
||||
png_ptr->transformations);
|
||||
|
||||
if (dsp_row != NULL)
|
||||
png_combine_row(png_ptr, dsp_row, 1/*display*/);
|
||||
@ -747,7 +747,7 @@ png_read_image(png_structrp png_ptr, png_bytepp image)
|
||||
* but the caller should do it!
|
||||
*/
|
||||
png_warning(png_ptr, "Interlace handling should be turned on when "
|
||||
"using png_read_image");
|
||||
"using png_read_image");
|
||||
/* Make sure this is set correctly */
|
||||
png_ptr->num_rows = png_ptr->height;
|
||||
}
|
||||
@ -807,8 +807,8 @@ png_read_end(png_structrp png_ptr, png_inforp info_ptr)
|
||||
#ifdef PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED
|
||||
/* Report invalid palette index; added at libng-1.5.10 */
|
||||
if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE &&
|
||||
png_ptr->num_palette_max > png_ptr->num_palette)
|
||||
png_benign_error(png_ptr, "Read palette index exceeding num_palette");
|
||||
png_ptr->num_palette_max > png_ptr->num_palette)
|
||||
png_benign_error(png_ptr, "Read palette index exceeding num_palette");
|
||||
#endif
|
||||
|
||||
do
|
||||
@ -947,7 +947,7 @@ png_read_end(png_structrp png_ptr, png_inforp info_ptr)
|
||||
|
||||
else
|
||||
png_handle_unknown(png_ptr, info_ptr, length,
|
||||
PNG_HANDLE_CHUNK_AS_DEFAULT);
|
||||
PNG_HANDLE_CHUNK_AS_DEFAULT);
|
||||
} while ((png_ptr->mode & PNG_HAVE_IEND) == 0);
|
||||
}
|
||||
#endif /* SEQUENTIAL_READ */
|
||||
@ -1058,8 +1058,7 @@ png_set_read_status_fn(png_structrp png_ptr, png_read_status_ptr read_row_fn)
|
||||
#ifdef PNG_INFO_IMAGE_SUPPORTED
|
||||
void PNGAPI
|
||||
png_read_png(png_structrp png_ptr, png_inforp info_ptr,
|
||||
int transforms,
|
||||
voidp params)
|
||||
int transforms, voidp params)
|
||||
{
|
||||
if (png_ptr == NULL || info_ptr == NULL)
|
||||
return;
|
||||
@ -1335,7 +1334,7 @@ png_image_read_init(png_imagep image)
|
||||
if (info_ptr != NULL)
|
||||
{
|
||||
png_controlp control = png_voidcast(png_controlp,
|
||||
png_malloc_warn(png_ptr, (sizeof *control)));
|
||||
png_malloc_warn(png_ptr, (sizeof *control)));
|
||||
|
||||
if (control != NULL)
|
||||
{
|
||||
@ -1422,7 +1421,9 @@ png_image_read_header(png_voidp argument)
|
||||
png_structrp png_ptr = image->opaque->png_ptr;
|
||||
png_inforp info_ptr = image->opaque->info_ptr;
|
||||
|
||||
#ifdef PNG_BENIGN_ERRORS_SUPPORTED
|
||||
png_set_benign_errors(png_ptr, 1/*warn*/);
|
||||
#endif
|
||||
png_read_info(png_ptr, info_ptr);
|
||||
|
||||
/* Do this the fast way; just read directly out of png_struct. */
|
||||
@ -1460,7 +1461,7 @@ png_image_read_header(png_voidp argument)
|
||||
break;
|
||||
|
||||
case PNG_COLOR_TYPE_PALETTE:
|
||||
cmap_entries = png_ptr->num_palette;
|
||||
cmap_entries = (png_uint_32)png_ptr->num_palette;
|
||||
break;
|
||||
|
||||
default:
|
||||
@ -1498,12 +1499,12 @@ png_image_begin_read_from_stdio(png_imagep image, FILE* file)
|
||||
|
||||
else
|
||||
return png_image_error(image,
|
||||
"png_image_begin_read_from_stdio: invalid argument");
|
||||
"png_image_begin_read_from_stdio: invalid argument");
|
||||
}
|
||||
|
||||
else if (image != NULL)
|
||||
return png_image_error(image,
|
||||
"png_image_begin_read_from_stdio: incorrect PNG_IMAGE_VERSION");
|
||||
"png_image_begin_read_from_stdio: incorrect PNG_IMAGE_VERSION");
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -1536,12 +1537,12 @@ png_image_begin_read_from_file(png_imagep image, const char *file_name)
|
||||
|
||||
else
|
||||
return png_image_error(image,
|
||||
"png_image_begin_read_from_file: invalid argument");
|
||||
"png_image_begin_read_from_file: invalid argument");
|
||||
}
|
||||
|
||||
else if (image != NULL)
|
||||
return png_image_error(image,
|
||||
"png_image_begin_read_from_file: incorrect PNG_IMAGE_VERSION");
|
||||
"png_image_begin_read_from_file: incorrect PNG_IMAGE_VERSION");
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -1578,7 +1579,7 @@ png_image_memory_read(png_structp png_ptr, png_bytep out, png_size_t need)
|
||||
}
|
||||
|
||||
int PNGAPI png_image_begin_read_from_memory(png_imagep image,
|
||||
png_const_voidp memory, png_size_t size)
|
||||
png_const_voidp memory, png_size_t size)
|
||||
{
|
||||
if (image != NULL && image->version == PNG_IMAGE_VERSION)
|
||||
{
|
||||
@ -1601,12 +1602,12 @@ int PNGAPI png_image_begin_read_from_memory(png_imagep image,
|
||||
|
||||
else
|
||||
return png_image_error(image,
|
||||
"png_image_begin_read_from_memory: invalid argument");
|
||||
"png_image_begin_read_from_memory: invalid argument");
|
||||
}
|
||||
|
||||
else if (image != NULL)
|
||||
return png_image_error(image,
|
||||
"png_image_begin_read_from_memory: incorrect PNG_IMAGE_VERSION");
|
||||
"png_image_begin_read_from_memory: incorrect PNG_IMAGE_VERSION");
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -1652,12 +1653,12 @@ png_image_skip_unused_chunks(png_structrp png_ptr)
|
||||
* IHDR, PLTE, tRNS, IDAT, and IEND chunks.
|
||||
*/
|
||||
png_set_keep_unknown_chunks(png_ptr, PNG_HANDLE_CHUNK_NEVER,
|
||||
NULL, -1);
|
||||
NULL, -1);
|
||||
|
||||
/* But do not ignore image data handling chunks */
|
||||
png_set_keep_unknown_chunks(png_ptr, PNG_HANDLE_CHUNK_AS_DEFAULT,
|
||||
chunks_to_process, (int)/*SAFE*/(sizeof chunks_to_process)/5);
|
||||
}
|
||||
chunks_to_process, (int)/*SAFE*/(sizeof chunks_to_process)/5);
|
||||
}
|
||||
}
|
||||
|
||||
# define PNG_SKIP_CHUNKS(p) png_image_skip_unused_chunks(p)
|
||||
@ -1724,7 +1725,7 @@ decode_gamma(png_image_read_control *display, png_uint_32 value, int encoding)
|
||||
#ifdef __GNUC__
|
||||
default:
|
||||
png_error(display->image->opaque->png_ptr,
|
||||
"unexpected encoding (internal error)");
|
||||
"unexpected encoding (internal error)");
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -1733,8 +1734,8 @@ decode_gamma(png_image_read_control *display, png_uint_32 value, int encoding)
|
||||
|
||||
static png_uint_32
|
||||
png_colormap_compose(png_image_read_control *display,
|
||||
png_uint_32 foreground, int foreground_encoding, png_uint_32 alpha,
|
||||
png_uint_32 background, int encoding)
|
||||
png_uint_32 foreground, int foreground_encoding, png_uint_32 alpha,
|
||||
png_uint_32 background, int encoding)
|
||||
{
|
||||
/* The file value is composed on the background, the background has the given
|
||||
* encoding and so does the result, the file is encoded with P_FILE and the
|
||||
@ -1770,14 +1771,14 @@ png_colormap_compose(png_image_read_control *display,
|
||||
*/
|
||||
static void
|
||||
png_create_colormap_entry(png_image_read_control *display,
|
||||
png_uint_32 ip, png_uint_32 red, png_uint_32 green, png_uint_32 blue,
|
||||
png_uint_32 alpha, int encoding)
|
||||
png_uint_32 ip, png_uint_32 red, png_uint_32 green, png_uint_32 blue,
|
||||
png_uint_32 alpha, int encoding)
|
||||
{
|
||||
png_imagep image = display->image;
|
||||
const int output_encoding = (image->format & PNG_FORMAT_FLAG_LINEAR) != 0 ?
|
||||
P_LINEAR : P_sRGB;
|
||||
P_LINEAR : P_sRGB;
|
||||
const int convert_to_Y = (image->format & PNG_FORMAT_FLAG_COLOR) == 0 &&
|
||||
(red != green || green != blue);
|
||||
(red != green || green != blue);
|
||||
|
||||
if (ip > 255)
|
||||
png_error(image->opaque->png_ptr, "color-map index out of range");
|
||||
@ -1995,7 +1996,7 @@ make_gray_file_colormap(png_image_read_control *display)
|
||||
for (i=0; i<256; ++i)
|
||||
png_create_colormap_entry(display, i, i, i, i, 255, P_FILE);
|
||||
|
||||
return i;
|
||||
return (int)i;
|
||||
}
|
||||
|
||||
static int
|
||||
@ -2006,7 +2007,7 @@ make_gray_colormap(png_image_read_control *display)
|
||||
for (i=0; i<256; ++i)
|
||||
png_create_colormap_entry(display, i, i, i, i, 255, P_sRGB);
|
||||
|
||||
return i;
|
||||
return (int)i;
|
||||
}
|
||||
#define PNG_GRAY_COLORMAP_ENTRIES 256
|
||||
|
||||
@ -2057,10 +2058,10 @@ make_ga_colormap(png_image_read_control *display)
|
||||
|
||||
for (g=0; g<6; ++g)
|
||||
png_create_colormap_entry(display, i++, g*51, g*51, g*51, a*51,
|
||||
P_sRGB);
|
||||
P_sRGB);
|
||||
}
|
||||
|
||||
return i;
|
||||
return (int)i;
|
||||
}
|
||||
|
||||
#define PNG_GA_COLORMAP_ENTRIES 256
|
||||
@ -2081,11 +2082,11 @@ make_rgb_colormap(png_image_read_control *display)
|
||||
|
||||
for (b=0; b<6; ++b)
|
||||
png_create_colormap_entry(display, i++, r*51, g*51, b*51, 255,
|
||||
P_sRGB);
|
||||
P_sRGB);
|
||||
}
|
||||
}
|
||||
|
||||
return i;
|
||||
return (int)i;
|
||||
}
|
||||
|
||||
#define PNG_RGB_COLORMAP_ENTRIES 216
|
||||
@ -2133,7 +2134,7 @@ png_image_read_colormap(png_voidp argument)
|
||||
|
||||
else if (display->background == NULL /* no way to remove it */)
|
||||
png_error(png_ptr,
|
||||
"a background color must be supplied to remove alpha/transparency");
|
||||
"background color must be supplied to remove alpha/transparency");
|
||||
|
||||
/* Get a copy of the background color (this avoids repeating the checks
|
||||
* below.) The encoding is 8-bit sRGB or 16-bit linear, depending on the
|
||||
@ -2228,7 +2229,7 @@ png_image_read_colormap(png_voidp argument)
|
||||
*/
|
||||
if (i != trans)
|
||||
png_create_colormap_entry(display, i, val, val, val, 255,
|
||||
P_FILE/*8-bit with file gamma*/);
|
||||
P_FILE/*8-bit with file gamma*/);
|
||||
|
||||
/* Else this entry is transparent. The colors don't matter if
|
||||
* there is an alpha channel (back_alpha == 0), but it does no
|
||||
@ -2240,7 +2241,7 @@ png_image_read_colormap(png_voidp argument)
|
||||
*/
|
||||
else
|
||||
png_create_colormap_entry(display, i, back_r, back_g, back_b,
|
||||
back_alpha, output_encoding);
|
||||
back_alpha, output_encoding);
|
||||
}
|
||||
|
||||
/* We need libpng to preserve the original encoding. */
|
||||
@ -2278,7 +2279,7 @@ png_image_read_colormap(png_voidp argument)
|
||||
if (PNG_GRAY_COLORMAP_ENTRIES > image->colormap_entries)
|
||||
png_error(png_ptr, "gray[16] color-map: too few entries");
|
||||
|
||||
cmap_entries = make_gray_colormap(display);
|
||||
cmap_entries = (unsigned int)make_gray_colormap(display);
|
||||
|
||||
if (png_ptr->num_trans > 0)
|
||||
{
|
||||
@ -2305,7 +2306,7 @@ png_image_read_colormap(png_voidp argument)
|
||||
* matches.
|
||||
*/
|
||||
png_create_colormap_entry(display, gray, back_g, back_g,
|
||||
back_g, 65535, P_LINEAR);
|
||||
back_g, 65535, P_LINEAR);
|
||||
}
|
||||
|
||||
/* The background passed to libpng, however, must be the
|
||||
@ -2319,8 +2320,8 @@ png_image_read_colormap(png_voidp argument)
|
||||
* doesn't.
|
||||
*/
|
||||
png_set_background_fixed(png_ptr, &c,
|
||||
PNG_BACKGROUND_GAMMA_SCREEN, 0/*need_expand*/,
|
||||
0/*gamma: not used*/);
|
||||
PNG_BACKGROUND_GAMMA_SCREEN, 0/*need_expand*/,
|
||||
0/*gamma: not used*/);
|
||||
|
||||
output_processing = PNG_CMAP_NONE;
|
||||
break;
|
||||
@ -2350,7 +2351,7 @@ png_image_read_colormap(png_voidp argument)
|
||||
* background color at full precision.
|
||||
*/
|
||||
png_create_colormap_entry(display, 254, back_r, back_g, back_b,
|
||||
back_alpha, output_encoding);
|
||||
back_alpha, output_encoding);
|
||||
}
|
||||
|
||||
else
|
||||
@ -2376,7 +2377,7 @@ png_image_read_colormap(png_voidp argument)
|
||||
if (PNG_GA_COLORMAP_ENTRIES > image->colormap_entries)
|
||||
png_error(png_ptr, "gray+alpha color-map: too few entries");
|
||||
|
||||
cmap_entries = make_ga_colormap(display);
|
||||
cmap_entries = (unsigned int)make_ga_colormap(display);
|
||||
|
||||
background_index = PNG_CMAP_GA_BACKGROUND;
|
||||
output_processing = PNG_CMAP_GA;
|
||||
@ -2410,7 +2411,7 @@ png_image_read_colormap(png_voidp argument)
|
||||
if (PNG_GRAY_COLORMAP_ENTRIES > image->colormap_entries)
|
||||
png_error(png_ptr, "gray-alpha color-map: too few entries");
|
||||
|
||||
cmap_entries = make_gray_colormap(display);
|
||||
cmap_entries = (unsigned int)make_gray_colormap(display);
|
||||
|
||||
if (output_encoding == P_LINEAR)
|
||||
{
|
||||
@ -2418,7 +2419,7 @@ png_image_read_colormap(png_voidp argument)
|
||||
|
||||
/* And make sure the corresponding palette entry matches. */
|
||||
png_create_colormap_entry(display, gray, back_g, back_g,
|
||||
back_g, 65535, P_LINEAR);
|
||||
back_g, 65535, P_LINEAR);
|
||||
}
|
||||
|
||||
/* The background passed to libpng, however, must be the sRGB
|
||||
@ -2428,8 +2429,8 @@ png_image_read_colormap(png_voidp argument)
|
||||
c.gray = c.red = c.green = c.blue = (png_uint_16)gray;
|
||||
|
||||
png_set_background_fixed(png_ptr, &c,
|
||||
PNG_BACKGROUND_GAMMA_SCREEN, 0/*need_expand*/,
|
||||
0/*gamma: not used*/);
|
||||
PNG_BACKGROUND_GAMMA_SCREEN, 0/*need_expand*/,
|
||||
0/*gamma: not used*/);
|
||||
|
||||
output_processing = PNG_CMAP_NONE;
|
||||
}
|
||||
@ -2449,7 +2450,7 @@ png_image_read_colormap(png_voidp argument)
|
||||
{
|
||||
png_uint_32 gray = (i * 256 + 115) / 231;
|
||||
png_create_colormap_entry(display, i++, gray, gray, gray,
|
||||
255, P_sRGB);
|
||||
255, P_sRGB);
|
||||
}
|
||||
|
||||
/* NOTE: this preserves the full precision of the application
|
||||
@ -2458,13 +2459,13 @@ png_image_read_colormap(png_voidp argument)
|
||||
background_index = i;
|
||||
png_create_colormap_entry(display, i++, back_r, back_g, back_b,
|
||||
#ifdef __COVERITY__
|
||||
/* Coverity claims that output_encoding cannot be 2 (P_LINEAR)
|
||||
* here.
|
||||
*/ 255U,
|
||||
/* Coverity claims that output_encoding
|
||||
* cannot be 2 (P_LINEAR) here.
|
||||
*/ 255U,
|
||||
#else
|
||||
output_encoding == P_LINEAR ? 65535U : 255U,
|
||||
output_encoding == P_LINEAR ? 65535U : 255U,
|
||||
#endif
|
||||
output_encoding);
|
||||
output_encoding);
|
||||
|
||||
/* For non-opaque input composite on the sRGB background - this
|
||||
* requires inverting the encoding for each component. The input
|
||||
@ -2502,9 +2503,9 @@ png_image_read_colormap(png_voidp argument)
|
||||
png_uint_32 gray = png_sRGB_table[g*51] * alpha;
|
||||
|
||||
png_create_colormap_entry(display, i++,
|
||||
PNG_sRGB_FROM_LINEAR(gray + back_rx),
|
||||
PNG_sRGB_FROM_LINEAR(gray + back_gx),
|
||||
PNG_sRGB_FROM_LINEAR(gray + back_bx), 255, P_sRGB);
|
||||
PNG_sRGB_FROM_LINEAR(gray + back_rx),
|
||||
PNG_sRGB_FROM_LINEAR(gray + back_gx),
|
||||
PNG_sRGB_FROM_LINEAR(gray + back_bx), 255, P_sRGB);
|
||||
}
|
||||
}
|
||||
|
||||
@ -2530,7 +2531,7 @@ png_image_read_colormap(png_voidp argument)
|
||||
* png_set_tRNS_to_alpha before png_set_background_fixed.
|
||||
*/
|
||||
png_set_rgb_to_gray_fixed(png_ptr, PNG_ERROR_ACTION_NONE, -1,
|
||||
-1);
|
||||
-1);
|
||||
data_encoding = P_sRGB;
|
||||
|
||||
/* The output will now be one or two 8-bit gray or gray+alpha
|
||||
@ -2549,7 +2550,7 @@ png_image_read_colormap(png_voidp argument)
|
||||
if (PNG_GA_COLORMAP_ENTRIES > image->colormap_entries)
|
||||
png_error(png_ptr, "rgb[ga] color-map: too few entries");
|
||||
|
||||
cmap_entries = make_ga_colormap(display);
|
||||
cmap_entries = (unsigned int)make_ga_colormap(display);
|
||||
background_index = PNG_CMAP_GA_BACKGROUND;
|
||||
output_processing = PNG_CMAP_GA;
|
||||
}
|
||||
@ -2575,12 +2576,12 @@ png_image_read_colormap(png_voidp argument)
|
||||
png_ptr->num_trans > 0) &&
|
||||
png_gamma_not_sRGB(png_ptr->colorspace.gamma) != 0)
|
||||
{
|
||||
cmap_entries = make_gray_file_colormap(display);
|
||||
cmap_entries = (unsigned int)make_gray_file_colormap(display);
|
||||
data_encoding = P_FILE;
|
||||
}
|
||||
|
||||
else
|
||||
cmap_entries = make_gray_colormap(display);
|
||||
cmap_entries = (unsigned int)make_gray_colormap(display);
|
||||
|
||||
/* But if the input has alpha or transparency it must be removed
|
||||
*/
|
||||
@ -2606,13 +2607,13 @@ png_image_read_colormap(png_voidp argument)
|
||||
gray = png_sRGB_table[gray]; /* now P_LINEAR */
|
||||
|
||||
gray = PNG_DIV257(png_gamma_16bit_correct(gray,
|
||||
png_ptr->colorspace.gamma)); /* now P_FILE */
|
||||
png_ptr->colorspace.gamma)); /* now P_FILE */
|
||||
|
||||
/* And make sure the corresponding palette entry contains
|
||||
* exactly the required sRGB value.
|
||||
*/
|
||||
png_create_colormap_entry(display, gray, back_g, back_g,
|
||||
back_g, 0/*unused*/, output_encoding);
|
||||
back_g, 0/*unused*/, output_encoding);
|
||||
}
|
||||
|
||||
else if (output_encoding == P_LINEAR)
|
||||
@ -2637,8 +2638,8 @@ png_image_read_colormap(png_voidp argument)
|
||||
*/
|
||||
expand_tRNS = 1;
|
||||
png_set_background_fixed(png_ptr, &c,
|
||||
PNG_BACKGROUND_GAMMA_SCREEN, 0/*need_expand*/,
|
||||
0/*gamma: not used*/);
|
||||
PNG_BACKGROUND_GAMMA_SCREEN, 0/*need_expand*/,
|
||||
0/*gamma: not used*/);
|
||||
}
|
||||
|
||||
output_processing = PNG_CMAP_NONE;
|
||||
@ -2668,11 +2669,11 @@ png_image_read_colormap(png_voidp argument)
|
||||
if (PNG_RGB_COLORMAP_ENTRIES+1+27 > image->colormap_entries)
|
||||
png_error(png_ptr, "rgb+alpha color-map: too few entries");
|
||||
|
||||
cmap_entries = make_rgb_colormap(display);
|
||||
cmap_entries = (unsigned int)make_rgb_colormap(display);
|
||||
|
||||
/* Add a transparent entry. */
|
||||
png_create_colormap_entry(display, cmap_entries, 255, 255,
|
||||
255, 0, P_sRGB);
|
||||
255, 0, P_sRGB);
|
||||
|
||||
/* This is stored as the background index for the processing
|
||||
* algorithm.
|
||||
@ -2693,7 +2694,7 @@ png_image_read_colormap(png_voidp argument)
|
||||
*/
|
||||
for (b=0; b<256; b = (b << 1) | 0x7f)
|
||||
png_create_colormap_entry(display, cmap_entries++,
|
||||
r, g, b, 128, P_sRGB);
|
||||
r, g, b, 128, P_sRGB);
|
||||
}
|
||||
}
|
||||
|
||||
@ -2717,10 +2718,10 @@ png_image_read_colormap(png_voidp argument)
|
||||
if (PNG_RGB_COLORMAP_ENTRIES+1+27 > image->colormap_entries)
|
||||
png_error(png_ptr, "rgb-alpha color-map: too few entries");
|
||||
|
||||
cmap_entries = make_rgb_colormap(display);
|
||||
cmap_entries = (unsigned int)make_rgb_colormap(display);
|
||||
|
||||
png_create_colormap_entry(display, cmap_entries, back_r,
|
||||
back_g, back_b, 0/*unused*/, output_encoding);
|
||||
back_g, back_b, 0/*unused*/, output_encoding);
|
||||
|
||||
if (output_encoding == P_LINEAR)
|
||||
{
|
||||
@ -2742,9 +2743,9 @@ png_image_read_colormap(png_voidp argument)
|
||||
* index.
|
||||
*/
|
||||
if (memcmp((png_const_bytep)display->colormap +
|
||||
sample_size * cmap_entries,
|
||||
(png_const_bytep)display->colormap +
|
||||
sample_size * PNG_RGB_INDEX(r,g,b),
|
||||
sample_size * cmap_entries,
|
||||
(png_const_bytep)display->colormap +
|
||||
sample_size * PNG_RGB_INDEX(r,g,b),
|
||||
sample_size) != 0)
|
||||
{
|
||||
/* The background color must be added. */
|
||||
@ -2762,13 +2763,13 @@ png_image_read_colormap(png_voidp argument)
|
||||
*/
|
||||
for (b=0; b<256; b = (b << 1) | 0x7f)
|
||||
png_create_colormap_entry(display, cmap_entries++,
|
||||
png_colormap_compose(display, r, P_sRGB, 128,
|
||||
back_r, output_encoding),
|
||||
png_colormap_compose(display, g, P_sRGB, 128,
|
||||
back_g, output_encoding),
|
||||
png_colormap_compose(display, b, P_sRGB, 128,
|
||||
back_b, output_encoding),
|
||||
0/*unused*/, output_encoding);
|
||||
png_colormap_compose(display, r, P_sRGB, 128,
|
||||
back_r, output_encoding),
|
||||
png_colormap_compose(display, g, P_sRGB, 128,
|
||||
back_g, output_encoding),
|
||||
png_colormap_compose(display, b, P_sRGB, 128,
|
||||
back_b, output_encoding),
|
||||
0/*unused*/, output_encoding);
|
||||
}
|
||||
}
|
||||
|
||||
@ -2786,8 +2787,8 @@ png_image_read_colormap(png_voidp argument)
|
||||
c.blue = (png_uint_16)back_b;
|
||||
|
||||
png_set_background_fixed(png_ptr, &c,
|
||||
PNG_BACKGROUND_GAMMA_SCREEN, 0/*need_expand*/,
|
||||
0/*gamma: not used*/);
|
||||
PNG_BACKGROUND_GAMMA_SCREEN, 0/*need_expand*/,
|
||||
0/*gamma: not used*/);
|
||||
|
||||
output_processing = PNG_CMAP_RGB;
|
||||
}
|
||||
@ -2802,7 +2803,7 @@ png_image_read_colormap(png_voidp argument)
|
||||
if (PNG_RGB_COLORMAP_ENTRIES > image->colormap_entries)
|
||||
png_error(png_ptr, "rgb color-map: too few entries");
|
||||
|
||||
cmap_entries = make_rgb_colormap(display);
|
||||
cmap_entries = (unsigned int)make_rgb_colormap(display);
|
||||
output_processing = PNG_CMAP_RGB;
|
||||
}
|
||||
}
|
||||
@ -2826,11 +2827,11 @@ png_image_read_colormap(png_voidp argument)
|
||||
|
||||
output_processing = PNG_CMAP_NONE;
|
||||
data_encoding = P_FILE; /* Don't change from color-map indices */
|
||||
cmap_entries = png_ptr->num_palette;
|
||||
cmap_entries = (unsigned int)png_ptr->num_palette;
|
||||
if (cmap_entries > 256)
|
||||
cmap_entries = 256;
|
||||
|
||||
if (cmap_entries > image->colormap_entries)
|
||||
if (cmap_entries > (unsigned int)image->colormap_entries)
|
||||
png_error(png_ptr, "palette color-map: too few entries");
|
||||
|
||||
for (i=0; i < cmap_entries; ++i)
|
||||
@ -2839,7 +2840,7 @@ png_image_read_colormap(png_voidp argument)
|
||||
{
|
||||
if (trans[i] == 0)
|
||||
png_create_colormap_entry(display, i, back_r, back_g,
|
||||
back_b, 0, output_encoding);
|
||||
back_b, 0, output_encoding);
|
||||
|
||||
else
|
||||
{
|
||||
@ -2847,22 +2848,22 @@ png_image_read_colormap(png_voidp argument)
|
||||
* on the sRGB color in 'back'.
|
||||
*/
|
||||
png_create_colormap_entry(display, i,
|
||||
png_colormap_compose(display, colormap[i].red, P_FILE,
|
||||
trans[i], back_r, output_encoding),
|
||||
png_colormap_compose(display, colormap[i].green, P_FILE,
|
||||
trans[i], back_g, output_encoding),
|
||||
png_colormap_compose(display, colormap[i].blue, P_FILE,
|
||||
trans[i], back_b, output_encoding),
|
||||
output_encoding == P_LINEAR ? trans[i] * 257U :
|
||||
trans[i],
|
||||
output_encoding);
|
||||
png_colormap_compose(display, colormap[i].red,
|
||||
P_FILE, trans[i], back_r, output_encoding),
|
||||
png_colormap_compose(display, colormap[i].green,
|
||||
P_FILE, trans[i], back_g, output_encoding),
|
||||
png_colormap_compose(display, colormap[i].blue,
|
||||
P_FILE, trans[i], back_b, output_encoding),
|
||||
output_encoding == P_LINEAR ? trans[i] * 257U :
|
||||
trans[i],
|
||||
output_encoding);
|
||||
}
|
||||
}
|
||||
|
||||
else
|
||||
png_create_colormap_entry(display, i, colormap[i].red,
|
||||
colormap[i].green, colormap[i].blue,
|
||||
i < num_trans ? trans[i] : 255U, P_FILE/*8-bit*/);
|
||||
colormap[i].green, colormap[i].blue,
|
||||
i < num_trans ? trans[i] : 255U, P_FILE/*8-bit*/);
|
||||
}
|
||||
|
||||
/* The PNG data may have indices packed in fewer than 8 bits, it
|
||||
@ -2942,7 +2943,7 @@ png_image_read_colormap(png_voidp argument)
|
||||
png_error(png_ptr, "bad background index (internal error)");
|
||||
}
|
||||
|
||||
display->colormap_processing = output_processing;
|
||||
display->colormap_processing = (int)output_processing;
|
||||
|
||||
return 1/*ok*/;
|
||||
}
|
||||
@ -2952,7 +2953,7 @@ static int
|
||||
png_image_read_and_map(png_voidp argument)
|
||||
{
|
||||
png_image_read_control *display = png_voidcast(png_image_read_control*,
|
||||
argument);
|
||||
argument);
|
||||
png_imagep image = display->image;
|
||||
png_structrp png_ptr = image->opaque->png_ptr;
|
||||
int passes;
|
||||
@ -3089,7 +3090,7 @@ png_image_read_and_map(png_voidp argument)
|
||||
|
||||
if (alpha >= 196)
|
||||
*outrow = PNG_RGB_INDEX(inrow[0], inrow[1],
|
||||
inrow[2]);
|
||||
inrow[2]);
|
||||
|
||||
else if (alpha < 64)
|
||||
*outrow = PNG_CMAP_RGB_ALPHA_BACKGROUND;
|
||||
@ -3141,7 +3142,7 @@ static int
|
||||
png_image_read_colormapped(png_voidp argument)
|
||||
{
|
||||
png_image_read_control *display = png_voidcast(png_image_read_control*,
|
||||
argument);
|
||||
argument);
|
||||
png_imagep image = display->image;
|
||||
png_controlp control = image->opaque;
|
||||
png_structrp png_ptr = control->png_ptr;
|
||||
@ -3251,14 +3252,14 @@ png_image_read_colormapped(png_voidp argument)
|
||||
|
||||
else
|
||||
{
|
||||
png_alloc_size_t row_bytes = display->row_bytes;
|
||||
png_alloc_size_t row_bytes = (png_alloc_size_t)display->row_bytes;
|
||||
|
||||
while (--passes >= 0)
|
||||
{
|
||||
png_uint_32 y = image->height;
|
||||
png_bytep row = png_voidcast(png_bytep, display->first_row);
|
||||
|
||||
while (y-- > 0)
|
||||
for (; y > 0; --y)
|
||||
{
|
||||
png_read_row(png_ptr, row, NULL);
|
||||
row += row_bytes;
|
||||
@ -3274,7 +3275,7 @@ static int
|
||||
png_image_read_composite(png_voidp argument)
|
||||
{
|
||||
png_image_read_control *display = png_voidcast(png_image_read_control*,
|
||||
argument);
|
||||
argument);
|
||||
png_imagep image = display->image;
|
||||
png_structrp png_ptr = image->opaque->png_ptr;
|
||||
int passes;
|
||||
@ -3401,7 +3402,7 @@ static int
|
||||
png_image_read_background(png_voidp argument)
|
||||
{
|
||||
png_image_read_control *display = png_voidcast(png_image_read_control*,
|
||||
argument);
|
||||
argument);
|
||||
png_imagep image = display->image;
|
||||
png_structrp png_ptr = image->opaque->png_ptr;
|
||||
png_inforp info_ptr = image->opaque->info_ptr;
|
||||
@ -3461,8 +3462,7 @@ png_image_read_background(png_voidp argument)
|
||||
|
||||
for (pass = 0; pass < passes; ++pass)
|
||||
{
|
||||
png_bytep row = png_voidcast(png_bytep,
|
||||
display->first_row);
|
||||
png_bytep row = png_voidcast(png_bytep, display->first_row);
|
||||
unsigned int startx, stepx, stepy;
|
||||
png_uint_32 y;
|
||||
|
||||
@ -3490,7 +3490,7 @@ png_image_read_background(png_voidp argument)
|
||||
for (; y<height; y += stepy)
|
||||
{
|
||||
png_bytep inrow = png_voidcast(png_bytep,
|
||||
display->local_row);
|
||||
display->local_row);
|
||||
png_bytep outrow = first_row + y * step_row;
|
||||
png_const_bytep end_row = outrow + width;
|
||||
|
||||
@ -3535,7 +3535,7 @@ png_image_read_background(png_voidp argument)
|
||||
for (; y<height; y += stepy)
|
||||
{
|
||||
png_bytep inrow = png_voidcast(png_bytep,
|
||||
display->local_row);
|
||||
display->local_row);
|
||||
png_bytep outrow = first_row + y * step_row;
|
||||
png_const_bytep end_row = outrow + width;
|
||||
|
||||
@ -3582,13 +3582,14 @@ png_image_read_background(png_voidp argument)
|
||||
*/
|
||||
{
|
||||
png_uint_16p first_row = png_voidcast(png_uint_16p,
|
||||
display->first_row);
|
||||
display->first_row);
|
||||
/* The division by two is safe because the caller passed in a
|
||||
* stride which was multiplied by 2 (below) to get row_bytes.
|
||||
*/
|
||||
ptrdiff_t step_row = display->row_bytes / 2;
|
||||
int preserve_alpha = (image->format & PNG_FORMAT_FLAG_ALPHA) != 0;
|
||||
unsigned int outchannels = 1+preserve_alpha;
|
||||
unsigned int preserve_alpha = (image->format &
|
||||
PNG_FORMAT_FLAG_ALPHA) != 0;
|
||||
unsigned int outchannels = 1U+preserve_alpha;
|
||||
int swap_alpha = 0;
|
||||
|
||||
# ifdef PNG_SIMPLIFIED_READ_AFIRST_SUPPORTED
|
||||
@ -3632,7 +3633,7 @@ png_image_read_background(png_voidp argument)
|
||||
|
||||
/* Read the row, which is packed: */
|
||||
png_read_row(png_ptr, png_voidcast(png_bytep,
|
||||
display->local_row), NULL);
|
||||
display->local_row), NULL);
|
||||
inrow = png_voidcast(png_const_uint_16p, display->local_row);
|
||||
|
||||
/* Now do the pre-multiplication on each pixel in this row.
|
||||
@ -3681,7 +3682,7 @@ static int
|
||||
png_image_read_direct(png_voidp argument)
|
||||
{
|
||||
png_image_read_control *display = png_voidcast(png_image_read_control*,
|
||||
argument);
|
||||
argument);
|
||||
png_imagep image = display->image;
|
||||
png_structrp png_ptr = image->opaque->png_ptr;
|
||||
png_inforp info_ptr = image->opaque->info_ptr;
|
||||
@ -3732,7 +3733,7 @@ png_image_read_direct(png_voidp argument)
|
||||
do_local_background = 1/*maybe*/;
|
||||
|
||||
png_set_rgb_to_gray_fixed(png_ptr, PNG_ERROR_ACTION_NONE,
|
||||
PNG_RGB_TO_GRAY_DEFAULT, PNG_RGB_TO_GRAY_DEFAULT);
|
||||
PNG_RGB_TO_GRAY_DEFAULT, PNG_RGB_TO_GRAY_DEFAULT);
|
||||
}
|
||||
|
||||
change &= ~PNG_FORMAT_FLAG_COLOR;
|
||||
@ -3791,7 +3792,7 @@ png_image_read_direct(png_voidp argument)
|
||||
* final value.
|
||||
*/
|
||||
if (png_muldiv(>est, output_gamma, png_ptr->colorspace.gamma,
|
||||
PNG_FP_1) != 0 && png_gamma_significant(gtest) == 0)
|
||||
PNG_FP_1) != 0 && png_gamma_significant(gtest) == 0)
|
||||
do_local_background = 0;
|
||||
|
||||
else if (mode == PNG_ALPHA_STANDARD)
|
||||
@ -3854,8 +3855,8 @@ png_image_read_direct(png_voidp argument)
|
||||
* pixels.
|
||||
*/
|
||||
png_set_background_fixed(png_ptr, &c,
|
||||
PNG_BACKGROUND_GAMMA_SCREEN, 0/*need_expand*/,
|
||||
0/*gamma: not used*/);
|
||||
PNG_BACKGROUND_GAMMA_SCREEN, 0/*need_expand*/,
|
||||
0/*gamma: not used*/);
|
||||
}
|
||||
|
||||
else /* compose on row: implemented below. */
|
||||
@ -4085,14 +4086,14 @@ png_image_read_direct(png_voidp argument)
|
||||
|
||||
else
|
||||
{
|
||||
png_alloc_size_t row_bytes = display->row_bytes;
|
||||
png_alloc_size_t row_bytes = (png_alloc_size_t)display->row_bytes;
|
||||
|
||||
while (--passes >= 0)
|
||||
{
|
||||
png_uint_32 y = image->height;
|
||||
png_bytep row = png_voidcast(png_bytep, display->first_row);
|
||||
|
||||
while (y-- > 0)
|
||||
for (; y > 0; --y)
|
||||
{
|
||||
png_read_row(png_ptr, row, NULL);
|
||||
row += row_bytes;
|
||||
@ -4105,7 +4106,7 @@ png_image_read_direct(png_voidp argument)
|
||||
|
||||
int PNGAPI
|
||||
png_image_finish_read(png_imagep image, png_const_colorp background,
|
||||
void *buffer, png_int_32 row_stride, void *colormap)
|
||||
void *buffer, png_int_32 row_stride, void *colormap)
|
||||
{
|
||||
if (image != NULL && image->version == PNG_IMAGE_VERSION)
|
||||
{
|
||||
@ -4115,7 +4116,13 @@ png_image_finish_read(png_imagep image, png_const_colorp background,
|
||||
*/
|
||||
const unsigned int channels = PNG_IMAGE_PIXEL_CHANNELS(image->format);
|
||||
|
||||
if (image->width <= 0x7FFFFFFFU/channels) /* no overflow */
|
||||
/* The following checks just the 'row_stride' calculation to ensure it
|
||||
* fits in a signed 32-bit value. Because channels/components can be
|
||||
* either 1 or 2 bytes in size the length of a row can still overflow 32
|
||||
* bits; this is just to verify that the 'row_stride' argument can be
|
||||
* represented.
|
||||
*/
|
||||
if (image->width <= 0x7fffffffU/channels) /* no overflow */
|
||||
{
|
||||
png_uint_32 check;
|
||||
const png_uint_32 png_row_stride = image->width * channels;
|
||||
@ -4124,18 +4131,35 @@ png_image_finish_read(png_imagep image, png_const_colorp background,
|
||||
row_stride = (png_int_32)/*SAFE*/png_row_stride;
|
||||
|
||||
if (row_stride < 0)
|
||||
check = -row_stride;
|
||||
check = (png_uint_32)(-row_stride);
|
||||
|
||||
else
|
||||
check = row_stride;
|
||||
check = (png_uint_32)row_stride;
|
||||
|
||||
/* This verifies 'check', the absolute value of the actual stride
|
||||
* passed in and detects overflow in the application calculation (i.e.
|
||||
* if the app did actually pass in a non-zero 'row_stride'.
|
||||
*/
|
||||
if (image->opaque != NULL && buffer != NULL && check >= png_row_stride)
|
||||
{
|
||||
/* Now check for overflow of the image buffer calculation; this
|
||||
* limits the whole image size to 32 bits for API compatibility with
|
||||
* the current, 32-bit, PNG_IMAGE_BUFFER_SIZE macro.
|
||||
*
|
||||
* The PNG_IMAGE_BUFFER_SIZE macro is:
|
||||
*
|
||||
* (PNG_IMAGE_PIXEL_COMPONENT_SIZE(fmt)*height*(row_stride))
|
||||
*
|
||||
* And the component size is always 1 or 2, so make sure that the
|
||||
* number of *bytes* that the application is saying are available
|
||||
* does actually fit into a 32-bit number.
|
||||
*
|
||||
* NOTE: this will be changed in 1.7 because PNG_IMAGE_BUFFER_SIZE
|
||||
* will be changed to use png_alloc_size_t; bigger images can be
|
||||
* accomodated on 64-bit systems.
|
||||
*/
|
||||
if (image->height <= 0xFFFFFFFF/png_row_stride)
|
||||
if (image->height <=
|
||||
0xffffffffU/PNG_IMAGE_PIXEL_COMPONENT_SIZE(image->format)/check)
|
||||
{
|
||||
if ((image->format & PNG_FORMAT_FLAG_COLORMAP) == 0 ||
|
||||
(image->colormap_entries > 0 && colormap != NULL))
|
||||
@ -4155,15 +4179,16 @@ png_image_finish_read(png_imagep image, png_const_colorp background,
|
||||
* all the setup has already been done.
|
||||
*/
|
||||
if ((image->format & PNG_FORMAT_FLAG_COLORMAP) != 0)
|
||||
result = png_safe_execute(image,
|
||||
png_image_read_colormap, &display) &&
|
||||
png_safe_execute(image,
|
||||
png_image_read_colormapped, &display);
|
||||
result =
|
||||
png_safe_execute(image,
|
||||
png_image_read_colormap, &display) &&
|
||||
png_safe_execute(image,
|
||||
png_image_read_colormapped, &display);
|
||||
|
||||
else
|
||||
result =
|
||||
png_safe_execute(image,
|
||||
png_image_read_direct, &display);
|
||||
png_image_read_direct, &display);
|
||||
|
||||
png_image_free(image);
|
||||
return result;
|
||||
@ -4171,27 +4196,27 @@ png_image_finish_read(png_imagep image, png_const_colorp background,
|
||||
|
||||
else
|
||||
return png_image_error(image,
|
||||
"png_image_finish_read[color-map]: no color-map");
|
||||
"png_image_finish_read[color-map]: no color-map");
|
||||
}
|
||||
|
||||
else
|
||||
return png_image_error(image,
|
||||
"png_image_finish_read: image too large");
|
||||
"png_image_finish_read: image too large");
|
||||
}
|
||||
|
||||
else
|
||||
return png_image_error(image,
|
||||
"png_image_finish_read: invalid argument");
|
||||
"png_image_finish_read: invalid argument");
|
||||
}
|
||||
|
||||
else
|
||||
return png_image_error(image,
|
||||
"png_image_finish_read: row_stride too large");
|
||||
"png_image_finish_read: row_stride too large");
|
||||
}
|
||||
|
||||
else if (image != NULL)
|
||||
return png_image_error(image,
|
||||
"png_image_finish_read: damaged PNG_IMAGE_VERSION");
|
||||
"png_image_finish_read: damaged PNG_IMAGE_VERSION");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -29,8 +29,8 @@
|
||||
* However, the following notice accompanied the original version of this
|
||||
* file and, per its terms, should not be removed:
|
||||
*
|
||||
* Last changed in libpng 1.6.17 [March 26, 2015]
|
||||
* Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson
|
||||
* Last changed in libpng 1.6.24 [August 4, 2016]
|
||||
* Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson
|
||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||
*
|
||||
@ -113,7 +113,7 @@ png_default_read_data(png_structp png_ptr, png_bytep data, png_size_t length)
|
||||
*/
|
||||
void PNGAPI
|
||||
png_set_read_fn(png_structrp png_ptr, png_voidp io_ptr,
|
||||
png_rw_ptr read_data_fn)
|
||||
png_rw_ptr read_data_fn)
|
||||
{
|
||||
if (png_ptr == NULL)
|
||||
return;
|
||||
|
@ -29,7 +29,7 @@
|
||||
* However, the following notice accompanied the original version of this
|
||||
* file and, per its terms, should not be removed:
|
||||
*
|
||||
* Last changed in libpng 1.6.22 [May 26, 2016]
|
||||
* Last changed in libpng 1.6.24 [August 4, 2016]
|
||||
* Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson
|
||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||
@ -76,7 +76,7 @@ png_set_crc_action(png_structrp png_ptr, int crit_action, int ancil_action)
|
||||
|
||||
case PNG_CRC_WARN_DISCARD: /* Not a valid action for critical data */
|
||||
png_warning(png_ptr,
|
||||
"Can't discard critical data on CRC error");
|
||||
"Can't discard critical data on CRC error");
|
||||
case PNG_CRC_ERROR_QUIT: /* Error/quit */
|
||||
|
||||
case PNG_CRC_DEFAULT:
|
||||
@ -129,7 +129,7 @@ png_rtran_ok(png_structrp png_ptr, int need_IHDR)
|
||||
{
|
||||
if ((png_ptr->flags & PNG_FLAG_ROW_INIT) != 0)
|
||||
png_app_error(png_ptr,
|
||||
"invalid after png_start_read_image or png_read_update_info");
|
||||
"invalid after png_start_read_image or png_read_update_info");
|
||||
|
||||
else if (need_IHDR && (png_ptr->mode & PNG_HAVE_IHDR) == 0)
|
||||
png_app_error(png_ptr, "invalid before the PNG header has been read");
|
||||
@ -237,7 +237,7 @@ png_set_strip_alpha(png_structrp png_ptr)
|
||||
#if defined(PNG_READ_ALPHA_MODE_SUPPORTED) || defined(PNG_READ_GAMMA_SUPPORTED)
|
||||
static png_fixed_point
|
||||
translate_gamma_flags(png_structrp png_ptr, png_fixed_point output_gamma,
|
||||
int is_screen)
|
||||
int is_screen)
|
||||
{
|
||||
/* Check for flag values. The main reason for having the old Mac value as a
|
||||
* flag is that it is pretty near impossible to work out what the correct
|
||||
@ -301,7 +301,7 @@ convert_gamma_value(png_structrp png_ptr, double output_gamma)
|
||||
#ifdef PNG_READ_ALPHA_MODE_SUPPORTED
|
||||
void PNGFAPI
|
||||
png_set_alpha_mode_fixed(png_structrp png_ptr, int mode,
|
||||
png_fixed_point output_gamma)
|
||||
png_fixed_point output_gamma)
|
||||
{
|
||||
int compose = 0;
|
||||
png_fixed_point file_gamma;
|
||||
@ -405,7 +405,7 @@ png_set_alpha_mode_fixed(png_structrp png_ptr, int mode,
|
||||
|
||||
if ((png_ptr->transformations & PNG_COMPOSE) != 0)
|
||||
png_error(png_ptr,
|
||||
"conflicting calls to set alpha mode and background");
|
||||
"conflicting calls to set alpha mode and background");
|
||||
|
||||
png_ptr->transformations |= PNG_COMPOSE;
|
||||
}
|
||||
@ -416,7 +416,7 @@ void PNGAPI
|
||||
png_set_alpha_mode(png_structrp png_ptr, int mode, double output_gamma)
|
||||
{
|
||||
png_set_alpha_mode_fixed(png_ptr, mode, convert_gamma_value(png_ptr,
|
||||
output_gamma));
|
||||
output_gamma));
|
||||
}
|
||||
# endif
|
||||
#endif
|
||||
@ -457,7 +457,7 @@ png_set_quantize(png_structrp png_ptr, png_colorp palette,
|
||||
int i;
|
||||
|
||||
png_ptr->quantize_index = (png_bytep)png_malloc(png_ptr,
|
||||
(png_uint_32)(num_palette * (sizeof (png_byte))));
|
||||
(png_uint_32)((png_uint_32)num_palette * (sizeof (png_byte))));
|
||||
for (i = 0; i < num_palette; i++)
|
||||
png_ptr->quantize_index[i] = (png_byte)i;
|
||||
}
|
||||
@ -474,7 +474,7 @@ png_set_quantize(png_structrp png_ptr, png_colorp palette,
|
||||
|
||||
/* Initialize an array to sort colors */
|
||||
png_ptr->quantize_sort = (png_bytep)png_malloc(png_ptr,
|
||||
(png_uint_32)(num_palette * (sizeof (png_byte))));
|
||||
(png_uint_32)((png_uint_32)num_palette * (sizeof (png_byte))));
|
||||
|
||||
/* Initialize the quantize_sort array */
|
||||
for (i = 0; i < num_palette; i++)
|
||||
@ -608,9 +608,9 @@ png_set_quantize(png_structrp png_ptr, png_colorp palette,
|
||||
|
||||
/* Initialize palette index arrays */
|
||||
png_ptr->index_to_palette = (png_bytep)png_malloc(png_ptr,
|
||||
(png_uint_32)(num_palette * (sizeof (png_byte))));
|
||||
(png_uint_32)((png_uint_32)num_palette * (sizeof (png_byte))));
|
||||
png_ptr->palette_to_index = (png_bytep)png_malloc(png_ptr,
|
||||
(png_uint_32)(num_palette * (sizeof (png_byte))));
|
||||
(png_uint_32)((png_uint_32)num_palette * (sizeof (png_byte))));
|
||||
|
||||
/* Initialize the sort array */
|
||||
for (i = 0; i < num_palette; i++)
|
||||
@ -830,7 +830,7 @@ png_set_quantize(png_structrp png_ptr, png_colorp palette,
|
||||
#ifdef PNG_READ_GAMMA_SUPPORTED
|
||||
void PNGFAPI
|
||||
png_set_gamma_fixed(png_structrp png_ptr, png_fixed_point scrn_gamma,
|
||||
png_fixed_point file_gamma)
|
||||
png_fixed_point file_gamma)
|
||||
{
|
||||
png_debug(1, "in png_set_gamma_fixed");
|
||||
|
||||
@ -872,7 +872,7 @@ void PNGAPI
|
||||
png_set_gamma(png_structrp png_ptr, double scrn_gamma, double file_gamma)
|
||||
{
|
||||
png_set_gamma_fixed(png_ptr, convert_gamma_value(png_ptr, scrn_gamma),
|
||||
convert_gamma_value(png_ptr, file_gamma));
|
||||
convert_gamma_value(png_ptr, file_gamma));
|
||||
}
|
||||
# endif /* FLOATING_POINT */
|
||||
#endif /* READ_GAMMA */
|
||||
@ -1018,7 +1018,7 @@ png_set_rgb_to_gray_fixed(png_structrp png_ptr, int error_action,
|
||||
* that it just worked and get a memory overwrite.
|
||||
*/
|
||||
png_error(png_ptr,
|
||||
"Cannot do RGB_TO_GRAY without EXPAND_SUPPORTED");
|
||||
"Cannot do RGB_TO_GRAY without EXPAND_SUPPORTED");
|
||||
|
||||
/* png_ptr->transformations &= ~PNG_RGB_TO_GRAY; */
|
||||
}
|
||||
@ -1045,7 +1045,7 @@ png_set_rgb_to_gray_fixed(png_structrp png_ptr, int error_action,
|
||||
{
|
||||
if (red >= 0 && green >= 0)
|
||||
png_app_warning(png_ptr,
|
||||
"ignoring out of range rgb_to_gray coefficients");
|
||||
"ignoring out of range rgb_to_gray coefficients");
|
||||
|
||||
/* Use the defaults, from the cHRM chunk if set, else the historical
|
||||
* values which are close to the sRGB/HDTV/ITU-Rec 709 values. See
|
||||
@ -1054,7 +1054,7 @@ png_set_rgb_to_gray_fixed(png_structrp png_ptr, int error_action,
|
||||
* something has already provided a default.
|
||||
*/
|
||||
if (png_ptr->rgb_to_gray_red_coeff == 0 &&
|
||||
png_ptr->rgb_to_gray_green_coeff == 0)
|
||||
png_ptr->rgb_to_gray_green_coeff == 0)
|
||||
{
|
||||
png_ptr->rgb_to_gray_red_coeff = 6968;
|
||||
png_ptr->rgb_to_gray_green_coeff = 23434;
|
||||
@ -1071,10 +1071,10 @@ png_set_rgb_to_gray_fixed(png_structrp png_ptr, int error_action,
|
||||
|
||||
void PNGAPI
|
||||
png_set_rgb_to_gray(png_structrp png_ptr, int error_action, double red,
|
||||
double green)
|
||||
double green)
|
||||
{
|
||||
png_set_rgb_to_gray_fixed(png_ptr, error_action,
|
||||
png_fixed(png_ptr, red, "rgb to gray red coefficient"),
|
||||
png_fixed(png_ptr, red, "rgb to gray red coefficient"),
|
||||
png_fixed(png_ptr, green, "rgb to gray green coefficient"));
|
||||
}
|
||||
#endif /* FLOATING POINT */
|
||||
@ -1331,7 +1331,7 @@ png_init_read_transformations(png_structrp png_ptr)
|
||||
{
|
||||
if (png_ptr->screen_gamma != 0) /* screen set too */
|
||||
gamma_correction = png_gamma_threshold(png_ptr->colorspace.gamma,
|
||||
png_ptr->screen_gamma);
|
||||
png_ptr->screen_gamma);
|
||||
|
||||
else
|
||||
/* Assume the output matches the input; a long time default behavior
|
||||
@ -1612,7 +1612,7 @@ png_init_read_transformations(png_structrp png_ptr)
|
||||
*/
|
||||
if ((png_ptr->transformations & PNG_RGB_TO_GRAY) != 0)
|
||||
png_warning(png_ptr,
|
||||
"libpng does not support gamma+background+rgb_to_gray");
|
||||
"libpng does not support gamma+background+rgb_to_gray");
|
||||
|
||||
if ((png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) != 0)
|
||||
{
|
||||
@ -1648,13 +1648,13 @@ png_init_read_transformations(png_structrp png_ptr)
|
||||
case PNG_BACKGROUND_GAMMA_FILE:
|
||||
g = png_reciprocal(png_ptr->colorspace.gamma);
|
||||
gs = png_reciprocal2(png_ptr->colorspace.gamma,
|
||||
png_ptr->screen_gamma);
|
||||
png_ptr->screen_gamma);
|
||||
break;
|
||||
|
||||
case PNG_BACKGROUND_GAMMA_UNIQUE:
|
||||
g = png_reciprocal(png_ptr->background_gamma);
|
||||
gs = png_reciprocal2(png_ptr->background_gamma,
|
||||
png_ptr->screen_gamma);
|
||||
png_ptr->screen_gamma);
|
||||
break;
|
||||
default:
|
||||
g = PNG_FP_1; /* back_1 */
|
||||
@ -1682,11 +1682,11 @@ png_init_read_transformations(png_structrp png_ptr)
|
||||
if (png_gamma_significant(g) != 0)
|
||||
{
|
||||
back_1.red = png_gamma_8bit_correct(png_ptr->background.red,
|
||||
g);
|
||||
g);
|
||||
back_1.green = png_gamma_8bit_correct(
|
||||
png_ptr->background.green, g);
|
||||
png_ptr->background.green, g);
|
||||
back_1.blue = png_gamma_8bit_correct(png_ptr->background.blue,
|
||||
g);
|
||||
g);
|
||||
}
|
||||
|
||||
else
|
||||
@ -1757,7 +1757,7 @@ png_init_read_transformations(png_structrp png_ptr)
|
||||
case PNG_BACKGROUND_GAMMA_FILE:
|
||||
g = png_reciprocal(png_ptr->colorspace.gamma);
|
||||
gs = png_reciprocal2(png_ptr->colorspace.gamma,
|
||||
png_ptr->screen_gamma);
|
||||
png_ptr->screen_gamma);
|
||||
break;
|
||||
|
||||
case PNG_BACKGROUND_GAMMA_UNIQUE:
|
||||
@ -2178,7 +2178,7 @@ png_do_unpack(png_row_infop row_info, png_bytep row)
|
||||
{
|
||||
png_bytep sp = row + (png_size_t)((row_width - 1) >> 3);
|
||||
png_bytep dp = row + (png_size_t)row_width - 1;
|
||||
png_uint_32 shift = 7 - (int)((row_width + 7) & 0x07);
|
||||
png_uint_32 shift = 7U - ((row_width + 7U) & 0x07);
|
||||
for (i = 0; i < row_width; i++)
|
||||
{
|
||||
*dp = (png_byte)((*sp >> shift) & 0x01);
|
||||
@ -2202,7 +2202,7 @@ png_do_unpack(png_row_infop row_info, png_bytep row)
|
||||
|
||||
png_bytep sp = row + (png_size_t)((row_width - 1) >> 2);
|
||||
png_bytep dp = row + (png_size_t)row_width - 1;
|
||||
png_uint_32 shift = (int)((3 - ((row_width + 3) & 0x03)) << 1);
|
||||
png_uint_32 shift = ((3U - ((row_width + 3U) & 0x03)) << 1);
|
||||
for (i = 0; i < row_width; i++)
|
||||
{
|
||||
*dp = (png_byte)((*sp >> shift) & 0x03);
|
||||
@ -2225,7 +2225,7 @@ png_do_unpack(png_row_infop row_info, png_bytep row)
|
||||
{
|
||||
png_bytep sp = row + (png_size_t)((row_width - 1) >> 1);
|
||||
png_bytep dp = row + (png_size_t)row_width - 1;
|
||||
png_uint_32 shift = (int)((1 - ((row_width + 1) & 0x01)) << 2);
|
||||
png_uint_32 shift = ((1U - ((row_width + 1U) & 0x01)) << 2);
|
||||
for (i = 0; i < row_width; i++)
|
||||
{
|
||||
*dp = (png_byte)((*sp >> shift) & 0x0f);
|
||||
@ -3251,7 +3251,8 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structrp png_ptr)
|
||||
== png_ptr->trans_color.gray)
|
||||
{
|
||||
unsigned int tmp = *sp & (0x7f7f >> (7 - shift));
|
||||
tmp |= png_ptr->background.gray << shift;
|
||||
tmp |=
|
||||
(unsigned int)(png_ptr->background.gray << shift);
|
||||
*sp = (png_byte)(tmp & 0xff);
|
||||
}
|
||||
|
||||
@ -3280,7 +3281,8 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structrp png_ptr)
|
||||
== png_ptr->trans_color.gray)
|
||||
{
|
||||
unsigned int tmp = *sp & (0x3f3f >> (6 - shift));
|
||||
tmp |= png_ptr->background.gray << shift;
|
||||
tmp |=
|
||||
(unsigned int)png_ptr->background.gray << shift;
|
||||
*sp = (png_byte)(tmp & 0xff);
|
||||
}
|
||||
|
||||
@ -3290,7 +3292,7 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structrp png_ptr)
|
||||
unsigned int g = (gamma_table [p | (p << 2) |
|
||||
(p << 4) | (p << 6)] >> 6) & 0x03;
|
||||
unsigned int tmp = *sp & (0x3f3f >> (6 - shift));
|
||||
tmp |= g << shift;
|
||||
tmp |= (unsigned int)(g << shift);
|
||||
*sp = (png_byte)(tmp & 0xff);
|
||||
}
|
||||
|
||||
@ -3316,7 +3318,8 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structrp png_ptr)
|
||||
== png_ptr->trans_color.gray)
|
||||
{
|
||||
unsigned int tmp = *sp & (0x3f3f >> (6 - shift));
|
||||
tmp |= png_ptr->background.gray << shift;
|
||||
tmp |=
|
||||
(unsigned int)png_ptr->background.gray << shift;
|
||||
*sp = (png_byte)(tmp & 0xff);
|
||||
}
|
||||
|
||||
@ -3346,7 +3349,8 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structrp png_ptr)
|
||||
== png_ptr->trans_color.gray)
|
||||
{
|
||||
unsigned int tmp = *sp & (0x0f0f >> (4 - shift));
|
||||
tmp |= png_ptr->background.gray << shift;
|
||||
tmp |=
|
||||
(unsigned int)(png_ptr->background.gray << shift);
|
||||
*sp = (png_byte)(tmp & 0xff);
|
||||
}
|
||||
|
||||
@ -3356,7 +3360,7 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structrp png_ptr)
|
||||
unsigned int g = (gamma_table[p | (p << 4)] >> 4) &
|
||||
0x0f;
|
||||
unsigned int tmp = *sp & (0x0f0f >> (4 - shift));
|
||||
tmp |= g << shift;
|
||||
tmp |= (unsigned int)(g << shift);
|
||||
*sp = (png_byte)(tmp & 0xff);
|
||||
}
|
||||
|
||||
@ -3382,7 +3386,8 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structrp png_ptr)
|
||||
== png_ptr->trans_color.gray)
|
||||
{
|
||||
unsigned int tmp = *sp & (0x0f0f >> (4 - shift));
|
||||
tmp |= png_ptr->background.gray << shift;
|
||||
tmp |=
|
||||
(unsigned int)(png_ptr->background.gray << shift);
|
||||
*sp = (png_byte)(tmp & 0xff);
|
||||
}
|
||||
|
||||
@ -4223,7 +4228,7 @@ png_do_encode_alpha(png_row_infop row_info, png_bytep row, png_structrp png_ptr)
|
||||
*/
|
||||
static void
|
||||
png_do_expand_palette(png_row_infop row_info, png_bytep row,
|
||||
png_const_colorp palette, png_const_bytep trans_alpha, int num_trans)
|
||||
png_const_colorp palette, png_const_bytep trans_alpha, int num_trans)
|
||||
{
|
||||
int shift, value;
|
||||
png_bytep sp, dp;
|
||||
@ -4530,7 +4535,7 @@ png_do_expand(png_row_infop row_info, png_bytep row,
|
||||
row_info->channels = 2;
|
||||
row_info->pixel_depth = (png_byte)(row_info->bit_depth << 1);
|
||||
row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth,
|
||||
row_width);
|
||||
row_width);
|
||||
}
|
||||
}
|
||||
else if (row_info->color_type == PNG_COLOR_TYPE_RGB &&
|
||||
@ -4790,7 +4795,7 @@ png_do_read_transformations(png_structrp png_ptr, png_row_infop row_info)
|
||||
(row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA ||
|
||||
row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA))
|
||||
png_do_strip_channel(row_info, png_ptr->row_buf + 1,
|
||||
0 /* at_start == false, because SWAP_ALPHA happens later */);
|
||||
0 /* at_start == false, because SWAP_ALPHA happens later */);
|
||||
#endif
|
||||
|
||||
#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED
|
||||
|
@ -29,8 +29,8 @@
|
||||
* However, the following notice accompanied the original version of this
|
||||
* file and, per its terms, should not be removed:
|
||||
*
|
||||
* Last changed in libpng 1.6.20 [December 3, 2014]
|
||||
* Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson
|
||||
* Last changed in libpng 1.6.27 [January 5, 2017]
|
||||
* Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson
|
||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||
*
|
||||
@ -114,11 +114,11 @@ png_get_int_32)(png_const_bytep buf)
|
||||
{
|
||||
png_uint_32 uval = png_get_uint_32(buf);
|
||||
if ((uval & 0x80000000) == 0) /* non-negative */
|
||||
return uval;
|
||||
return (png_int_32)uval;
|
||||
|
||||
uval = (uval ^ 0xffffffff) + 1; /* 2's complement: -x = ~x+1 */
|
||||
if ((uval & 0x80000000) == 0) /* no overflow */
|
||||
return -(png_int_32)uval;
|
||||
return -(png_int_32)uval;
|
||||
/* The following has to be safe; this function only gets called on PNG data
|
||||
* and if we get here that data is invalid. 0 is the most safe value and
|
||||
* if not then an attacker would surely just generate a PNG with 0 instead.
|
||||
@ -398,11 +398,10 @@ png_inflate_claim(png_structrp png_ptr, png_uint_32 owner)
|
||||
*/
|
||||
{
|
||||
int ret; /* zlib return code */
|
||||
#if PNG_ZLIB_VERNUM >= 0x1240
|
||||
#if ZLIB_VERNUM >= 0x1240
|
||||
int window_bits = 0;
|
||||
|
||||
# if defined(PNG_SET_OPTION_SUPPORTED) && defined(PNG_MAXIMUM_INFLATE_WINDOW)
|
||||
int window_bits;
|
||||
|
||||
if (((png_ptr->options >> PNG_MAXIMUM_INFLATE_WINDOW) & 3) ==
|
||||
PNG_OPTION_ON)
|
||||
{
|
||||
@ -412,13 +411,11 @@ png_inflate_claim(png_structrp png_ptr, png_uint_32 owner)
|
||||
|
||||
else
|
||||
{
|
||||
window_bits = 0;
|
||||
png_ptr->zstream_start = 1;
|
||||
}
|
||||
# else
|
||||
# define window_bits 0
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#endif /* ZLIB_VERNUM >= 0x1240 */
|
||||
|
||||
/* Set this for safety, just in case the previous owner left pointers to
|
||||
* memory allocations.
|
||||
@ -430,25 +427,32 @@ png_inflate_claim(png_structrp png_ptr, png_uint_32 owner)
|
||||
|
||||
if ((png_ptr->flags & PNG_FLAG_ZSTREAM_INITIALIZED) != 0)
|
||||
{
|
||||
#if PNG_ZLIB_VERNUM < 0x1240
|
||||
ret = inflateReset(&png_ptr->zstream);
|
||||
#else
|
||||
#if ZLIB_VERNUM >= 0x1240
|
||||
ret = inflateReset2(&png_ptr->zstream, window_bits);
|
||||
#else
|
||||
ret = inflateReset(&png_ptr->zstream);
|
||||
#endif
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
#if PNG_ZLIB_VERNUM < 0x1240
|
||||
ret = inflateInit(&png_ptr->zstream);
|
||||
#else
|
||||
#if ZLIB_VERNUM >= 0x1240
|
||||
ret = inflateInit2(&png_ptr->zstream, window_bits);
|
||||
#else
|
||||
ret = inflateInit(&png_ptr->zstream);
|
||||
#endif
|
||||
|
||||
if (ret == Z_OK)
|
||||
png_ptr->flags |= PNG_FLAG_ZSTREAM_INITIALIZED;
|
||||
}
|
||||
|
||||
#if ZLIB_VERNUM >= 0x1281 && \
|
||||
defined(PNG_SET_OPTION_SUPPORTED) && defined(PNG_IGNORE_ADLER32)
|
||||
if (((png_ptr->options >> PNG_IGNORE_ADLER32) & 3) == PNG_OPTION_ON)
|
||||
/* Turn off validation of the ADLER32 checksum in IDAT chunks */
|
||||
ret = inflateValidate(&png_ptr->zstream, 0);
|
||||
#endif
|
||||
|
||||
if (ret == Z_OK)
|
||||
png_ptr->zowner = owner;
|
||||
|
||||
@ -463,7 +467,7 @@ png_inflate_claim(png_structrp png_ptr, png_uint_32 owner)
|
||||
#endif
|
||||
}
|
||||
|
||||
#if PNG_ZLIB_VERNUM >= 0x1240
|
||||
#if ZLIB_VERNUM >= 0x1240
|
||||
/* Handle the start of the inflate stream if we called inflateInit2(strm,0);
|
||||
* in this case some zlib versions skip validation of the CINFO field and, in
|
||||
* certain circumstances, libpng may end up displaying an invalid image, in
|
||||
@ -489,6 +493,7 @@ png_zlib_inflate(png_structrp png_ptr, int flush)
|
||||
#endif /* Zlib >= 1.2.4 */
|
||||
|
||||
#ifdef PNG_READ_COMPRESSED_TEXT_SUPPORTED
|
||||
#if defined(PNG_READ_zTXt_SUPPORTED) || defined (PNG_READ_iTXt_SUPPORTED)
|
||||
/* png_inflate now returns zlib error codes including Z_OK and Z_STREAM_END to
|
||||
* allow the caller to do multiple calls if required. If the 'finish' flag is
|
||||
* set Z_FINISH will be passed to the final inflate() call and Z_STREAM_END must
|
||||
@ -627,9 +632,9 @@ png_inflate(png_structrp png_ptr, png_uint_32 owner, int finish,
|
||||
*/
|
||||
static int
|
||||
png_decompress_chunk(png_structrp png_ptr,
|
||||
png_uint_32 chunklength, png_uint_32 prefix_size,
|
||||
png_alloc_size_t *newlength /* must be initialized to the maximum! */,
|
||||
int terminate /*add a '\0' to the end of the uncompressed data*/)
|
||||
png_uint_32 chunklength, png_uint_32 prefix_size,
|
||||
png_alloc_size_t *newlength /* must be initialized to the maximum! */,
|
||||
int terminate /*add a '\0' to the end of the uncompressed data*/)
|
||||
{
|
||||
/* TODO: implement different limits for different types of chunk.
|
||||
*
|
||||
@ -666,8 +671,8 @@ png_decompress_chunk(png_structrp png_ptr,
|
||||
png_uint_32 lzsize = chunklength - prefix_size;
|
||||
|
||||
ret = png_inflate(png_ptr, png_ptr->chunk_name, 1/*finish*/,
|
||||
/* input: */ png_ptr->read_buffer + prefix_size, &lzsize,
|
||||
/* output: */ NULL, newlength);
|
||||
/* input: */ png_ptr->read_buffer + prefix_size, &lzsize,
|
||||
/* output: */ NULL, newlength);
|
||||
|
||||
if (ret == Z_STREAM_END)
|
||||
{
|
||||
@ -687,15 +692,15 @@ png_decompress_chunk(png_structrp png_ptr,
|
||||
*/
|
||||
png_alloc_size_t new_size = *newlength;
|
||||
png_alloc_size_t buffer_size = prefix_size + new_size +
|
||||
(terminate != 0);
|
||||
(terminate != 0);
|
||||
png_bytep text = png_voidcast(png_bytep, png_malloc_base(png_ptr,
|
||||
buffer_size));
|
||||
buffer_size));
|
||||
|
||||
if (text != NULL)
|
||||
{
|
||||
ret = png_inflate(png_ptr, png_ptr->chunk_name, 1/*finish*/,
|
||||
png_ptr->read_buffer + prefix_size, &lzsize,
|
||||
text + prefix_size, newlength);
|
||||
png_ptr->read_buffer + prefix_size, &lzsize,
|
||||
text + prefix_size, newlength);
|
||||
|
||||
if (ret == Z_STREAM_END)
|
||||
{
|
||||
@ -740,7 +745,7 @@ png_decompress_chunk(png_structrp png_ptr,
|
||||
* the extra space may otherwise be used as a Trojan Horse.
|
||||
*/
|
||||
if (ret == Z_STREAM_END &&
|
||||
chunklength - prefix_size != lzsize)
|
||||
chunklength - prefix_size != lzsize)
|
||||
png_chunk_benign_error(png_ptr, "extra compressed data");
|
||||
}
|
||||
|
||||
@ -782,6 +787,7 @@ png_decompress_chunk(png_structrp png_ptr,
|
||||
return Z_MEM_ERROR;
|
||||
}
|
||||
}
|
||||
#endif /* READ_zTXt || READ_iTXt */
|
||||
#endif /* READ_COMPRESSED_TEXT */
|
||||
|
||||
#ifdef PNG_READ_iCCP_SUPPORTED
|
||||
@ -790,8 +796,8 @@ png_decompress_chunk(png_structrp png_ptr,
|
||||
*/
|
||||
static int
|
||||
png_inflate_read(png_structrp png_ptr, png_bytep read_buffer, uInt read_size,
|
||||
png_uint_32p chunk_bytes, png_bytep next_out, png_alloc_size_t *out_size,
|
||||
int finish)
|
||||
png_uint_32p chunk_bytes, png_bytep next_out, png_alloc_size_t *out_size,
|
||||
int finish)
|
||||
{
|
||||
if (png_ptr->zowner == png_ptr->chunk_name)
|
||||
{
|
||||
@ -830,8 +836,8 @@ png_inflate_read(png_structrp png_ptr, png_bytep read_buffer, uInt read_size,
|
||||
* the available output is produced; this allows reading of truncated
|
||||
* streams.
|
||||
*/
|
||||
ret = PNG_INFLATE(png_ptr,
|
||||
*chunk_bytes > 0 ? Z_NO_FLUSH : (finish ? Z_FINISH : Z_SYNC_FLUSH));
|
||||
ret = PNG_INFLATE(png_ptr, *chunk_bytes > 0 ?
|
||||
Z_NO_FLUSH : (finish ? Z_FINISH : Z_SYNC_FLUSH));
|
||||
}
|
||||
while (ret == Z_OK && (*out_size > 0 || png_ptr->zstream.avail_out > 0));
|
||||
|
||||
@ -849,7 +855,7 @@ png_inflate_read(png_structrp png_ptr, png_bytep read_buffer, uInt read_size,
|
||||
return Z_STREAM_ERROR;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#endif /* READ_iCCP */
|
||||
|
||||
/* Read and check the IDHR chunk */
|
||||
|
||||
@ -1037,7 +1043,7 @@ png_handle_PLTE(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
|
||||
if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
|
||||
#endif
|
||||
{
|
||||
png_crc_finish(png_ptr, (int) length - num * 3);
|
||||
png_crc_finish(png_ptr, (png_uint_32) (length - (unsigned int)num * 3));
|
||||
}
|
||||
|
||||
#ifndef PNG_READ_OPT_PLTE_SUPPORTED
|
||||
@ -1320,7 +1326,7 @@ png_handle_cHRM(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
|
||||
|
||||
png_ptr->colorspace.flags |= PNG_COLORSPACE_FROM_cHRM;
|
||||
(void)png_colorspace_set_chromaticities(png_ptr, &png_ptr->colorspace, &xy,
|
||||
1/*prefer cHRM values*/);
|
||||
1/*prefer cHRM values*/);
|
||||
png_colorspace_sync(png_ptr, info_ptr);
|
||||
}
|
||||
#endif
|
||||
@ -1460,8 +1466,8 @@ png_handle_iCCP(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
|
||||
png_ptr->zstream.next_in = (Bytef*)keyword + (keyword_length+2);
|
||||
png_ptr->zstream.avail_in = read_length;
|
||||
(void)png_inflate_read(png_ptr, local_buffer,
|
||||
(sizeof local_buffer), &length, profile_header, &size,
|
||||
0/*finish: don't, because the output is too small*/);
|
||||
(sizeof local_buffer), &length, profile_header, &size,
|
||||
0/*finish: don't, because the output is too small*/);
|
||||
|
||||
if (size == 0)
|
||||
{
|
||||
@ -1471,14 +1477,14 @@ png_handle_iCCP(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
|
||||
png_get_uint_32(profile_header);
|
||||
|
||||
if (png_icc_check_length(png_ptr, &png_ptr->colorspace,
|
||||
keyword, profile_length) != 0)
|
||||
keyword, profile_length) != 0)
|
||||
{
|
||||
/* The length is apparently ok, so we can check the 132
|
||||
* byte header.
|
||||
*/
|
||||
if (png_icc_check_header(png_ptr, &png_ptr->colorspace,
|
||||
keyword, profile_length, profile_header,
|
||||
png_ptr->color_type) != 0)
|
||||
keyword, profile_length, profile_header,
|
||||
png_ptr->color_type) != 0)
|
||||
{
|
||||
/* Now read the tag table; a variable size buffer is
|
||||
* needed at this point, allocate one for the whole
|
||||
@ -1486,20 +1492,20 @@ png_handle_iCCP(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
|
||||
* that none of these stuff will overflow.
|
||||
*/
|
||||
const png_uint_32 tag_count = png_get_uint_32(
|
||||
profile_header+128);
|
||||
profile_header+128);
|
||||
png_bytep profile = png_read_buffer(png_ptr,
|
||||
profile_length, 2/*silent*/);
|
||||
profile_length, 2/*silent*/);
|
||||
|
||||
if (profile != NULL)
|
||||
{
|
||||
memcpy(profile, profile_header,
|
||||
(sizeof profile_header));
|
||||
(sizeof profile_header));
|
||||
|
||||
size = 12 * tag_count;
|
||||
|
||||
(void)png_inflate_read(png_ptr, local_buffer,
|
||||
(sizeof local_buffer), &length,
|
||||
profile + (sizeof profile_header), &size, 0);
|
||||
(sizeof local_buffer), &length,
|
||||
profile + (sizeof profile_header), &size, 0);
|
||||
|
||||
/* Still expect a buffer error because we expect
|
||||
* there to be some tag data!
|
||||
@ -1507,22 +1513,22 @@ png_handle_iCCP(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
|
||||
if (size == 0)
|
||||
{
|
||||
if (png_icc_check_tag_table(png_ptr,
|
||||
&png_ptr->colorspace, keyword, profile_length,
|
||||
profile) != 0)
|
||||
&png_ptr->colorspace, keyword, profile_length,
|
||||
profile) != 0)
|
||||
{
|
||||
/* The profile has been validated for basic
|
||||
* security issues, so read the whole thing in.
|
||||
*/
|
||||
size = profile_length - (sizeof profile_header)
|
||||
- 12 * tag_count;
|
||||
- 12 * tag_count;
|
||||
|
||||
(void)png_inflate_read(png_ptr, local_buffer,
|
||||
(sizeof local_buffer), &length,
|
||||
profile + (sizeof profile_header) +
|
||||
12 * tag_count, &size, 1/*finish*/);
|
||||
(sizeof local_buffer), &length,
|
||||
profile + (sizeof profile_header) +
|
||||
12 * tag_count, &size, 1/*finish*/);
|
||||
|
||||
if (length > 0 && !(png_ptr->flags &
|
||||
PNG_FLAG_BENIGN_ERRORS_WARN))
|
||||
PNG_FLAG_BENIGN_ERRORS_WARN))
|
||||
errmsg = "extra compressed data";
|
||||
|
||||
/* But otherwise allow extra data: */
|
||||
@ -1534,34 +1540,34 @@ png_handle_iCCP(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
|
||||
* keep going.
|
||||
*/
|
||||
png_chunk_warning(png_ptr,
|
||||
"extra compressed data");
|
||||
"extra compressed data");
|
||||
}
|
||||
|
||||
png_crc_finish(png_ptr, length);
|
||||
finished = 1;
|
||||
|
||||
# ifdef PNG_sRGB_SUPPORTED
|
||||
# if defined(PNG_sRGB_SUPPORTED) && PNG_sRGB_PROFILE_CHECKS >= 0
|
||||
/* Check for a match against sRGB */
|
||||
png_icc_set_sRGB(png_ptr,
|
||||
&png_ptr->colorspace, profile,
|
||||
png_ptr->zstream.adler);
|
||||
# endif
|
||||
&png_ptr->colorspace, profile,
|
||||
png_ptr->zstream.adler);
|
||||
# endif
|
||||
|
||||
/* Steal the profile for info_ptr. */
|
||||
if (info_ptr != NULL)
|
||||
{
|
||||
png_free_data(png_ptr, info_ptr,
|
||||
PNG_FREE_ICCP, 0);
|
||||
PNG_FREE_ICCP, 0);
|
||||
|
||||
info_ptr->iccp_name = png_voidcast(char*,
|
||||
png_malloc_base(png_ptr,
|
||||
keyword_length+1));
|
||||
png_malloc_base(png_ptr,
|
||||
keyword_length+1));
|
||||
if (info_ptr->iccp_name != NULL)
|
||||
{
|
||||
memcpy(info_ptr->iccp_name, keyword,
|
||||
keyword_length+1);
|
||||
keyword_length+1);
|
||||
info_ptr->iccp_proflen =
|
||||
profile_length;
|
||||
profile_length;
|
||||
info_ptr->iccp_profile = profile;
|
||||
png_ptr->read_buffer = NULL; /*steal*/
|
||||
info_ptr->free_me |= PNG_FREE_ICCP;
|
||||
@ -1743,13 +1749,13 @@ png_handle_sPLT(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
|
||||
data_length = length - (png_uint_32)(entry_start - buffer);
|
||||
|
||||
/* Integrity-check the data length */
|
||||
if ((data_length % entry_size) != 0)
|
||||
if ((data_length % (unsigned int)entry_size) != 0)
|
||||
{
|
||||
png_warning(png_ptr, "sPLT chunk has bad length");
|
||||
return;
|
||||
}
|
||||
|
||||
dl = (png_int_32)(data_length / entry_size);
|
||||
dl = (png_uint_32)(data_length / (unsigned int)entry_size);
|
||||
max_dl = PNG_SIZE_MAX / (sizeof (png_sPLT_entry));
|
||||
|
||||
if (dl > max_dl)
|
||||
@ -1758,10 +1764,10 @@ png_handle_sPLT(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
|
||||
return;
|
||||
}
|
||||
|
||||
new_palette.nentries = (png_int_32)(data_length / entry_size);
|
||||
new_palette.nentries = (png_int_32)(data_length / (unsigned int)entry_size);
|
||||
|
||||
new_palette.entries = (png_sPLT_entryp)png_malloc_warn(
|
||||
png_ptr, new_palette.nentries * (sizeof (png_sPLT_entry)));
|
||||
new_palette.entries = (png_sPLT_entryp)png_malloc_warn(png_ptr,
|
||||
(png_alloc_size_t) new_palette.nentries * (sizeof (png_sPLT_entry)));
|
||||
|
||||
if (new_palette.entries == NULL)
|
||||
{
|
||||
@ -2298,7 +2304,7 @@ png_handle_pCAL(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
|
||||
}
|
||||
|
||||
png_set_pCAL(png_ptr, info_ptr, (png_charp)buffer, X0, X1, type, nparams,
|
||||
(png_charp)units, params);
|
||||
(png_charp)units, params);
|
||||
|
||||
png_free(png_ptr, params);
|
||||
}
|
||||
@ -2341,7 +2347,7 @@ png_handle_sCAL(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
|
||||
}
|
||||
|
||||
png_debug1(2, "Allocating and reading sCAL chunk data (%u bytes)",
|
||||
length + 1);
|
||||
length + 1);
|
||||
|
||||
buffer = png_read_buffer(png_ptr, length+1, 2/*silent*/);
|
||||
|
||||
@ -2393,7 +2399,7 @@ png_handle_sCAL(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
|
||||
else
|
||||
/* This is the (only) success case. */
|
||||
png_set_sCAL_s(png_ptr, info_ptr, buffer[0],
|
||||
(png_charp)buffer+1, (png_charp)buffer+heighti);
|
||||
(png_charp)buffer+1, (png_charp)buffer+heighti);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@ -2493,8 +2499,8 @@ png_handle_tEXt(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
|
||||
|
||||
if (buffer == NULL)
|
||||
{
|
||||
png_chunk_benign_error(png_ptr, "out of memory");
|
||||
return;
|
||||
png_chunk_benign_error(png_ptr, "out of memory");
|
||||
return;
|
||||
}
|
||||
|
||||
png_crc_read(png_ptr, buffer, length);
|
||||
@ -2601,7 +2607,7 @@ png_handle_zTXt(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
|
||||
* and text chunks.
|
||||
*/
|
||||
if (png_decompress_chunk(png_ptr, length, keyword_length+2,
|
||||
&uncompressed_length, 1/*terminate*/) == Z_STREAM_END)
|
||||
&uncompressed_length, 1/*terminate*/) == Z_STREAM_END)
|
||||
{
|
||||
png_text text;
|
||||
|
||||
@ -2741,7 +2747,7 @@ png_handle_iTXt(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
|
||||
* iCCP and text chunks.
|
||||
*/
|
||||
if (png_decompress_chunk(png_ptr, length, prefix_length,
|
||||
&uncompressed_length, 1/*terminate*/) == Z_STREAM_END)
|
||||
&uncompressed_length, 1/*terminate*/) == Z_STREAM_END)
|
||||
buffer = png_ptr->read_buffer;
|
||||
|
||||
else
|
||||
@ -2821,7 +2827,7 @@ png_cache_unknown_chunk(png_structrp png_ptr, png_uint_32 length)
|
||||
{
|
||||
/* Do a 'warn' here - it is handled below. */
|
||||
png_ptr->unknown_chunk.data = png_voidcast(png_bytep,
|
||||
png_malloc_warn(png_ptr, length));
|
||||
png_malloc_warn(png_ptr, length));
|
||||
}
|
||||
}
|
||||
|
||||
@ -2846,7 +2852,7 @@ png_cache_unknown_chunk(png_structrp png_ptr, png_uint_32 length)
|
||||
/* Handle an unknown, or known but disabled, chunk */
|
||||
void /* PRIVATE */
|
||||
png_handle_unknown(png_structrp png_ptr, png_inforp info_ptr,
|
||||
png_uint_32 length, int keep)
|
||||
png_uint_32 length, int keep)
|
||||
{
|
||||
int handled = 0; /* the chunk was handled */
|
||||
|
||||
@ -2884,7 +2890,7 @@ png_handle_unknown(png_structrp png_ptr, png_inforp info_ptr,
|
||||
{
|
||||
/* Callback to user unknown chunk handler */
|
||||
int ret = (*(png_ptr->read_user_chunk_fn))(png_ptr,
|
||||
&png_ptr->unknown_chunk);
|
||||
&png_ptr->unknown_chunk);
|
||||
|
||||
/* ret is:
|
||||
* negative: An error occurred; png_chunk_error will be called.
|
||||
@ -2918,9 +2924,9 @@ png_handle_unknown(png_structrp png_ptr, png_inforp info_ptr,
|
||||
{
|
||||
png_chunk_warning(png_ptr, "Saving unknown chunk:");
|
||||
png_app_warning(png_ptr,
|
||||
"forcing save of an unhandled chunk;"
|
||||
" please call png_set_keep_unknown_chunks");
|
||||
/* with keep = PNG_HANDLE_CHUNK_IF_SAFE */
|
||||
"forcing save of an unhandled chunk;"
|
||||
" please call png_set_keep_unknown_chunks");
|
||||
/* with keep = PNG_HANDLE_CHUNK_IF_SAFE */
|
||||
}
|
||||
# endif
|
||||
keep = PNG_HANDLE_CHUNK_IF_SAFE;
|
||||
@ -3013,7 +3019,7 @@ png_handle_unknown(png_structrp png_ptr, png_inforp info_ptr,
|
||||
* out; store the chunk.
|
||||
*/
|
||||
png_set_unknown_chunks(png_ptr, info_ptr,
|
||||
&png_ptr->unknown_chunk, 1);
|
||||
&png_ptr->unknown_chunk, 1);
|
||||
handled = 1;
|
||||
# ifdef PNG_USER_LIMITS_SUPPORTED
|
||||
break;
|
||||
@ -3125,7 +3131,7 @@ png_combine_row(png_const_structrp png_ptr, png_bytep dp, int display)
|
||||
# ifdef PNG_READ_PACKSWAP_SUPPORTED
|
||||
if ((png_ptr->transformations & PNG_PACKSWAP) != 0)
|
||||
/* little-endian byte */
|
||||
end_mask = 0xff << end_mask;
|
||||
end_mask = (unsigned int)(0xff << end_mask);
|
||||
|
||||
else /* big-endian byte */
|
||||
# endif
|
||||
@ -3446,8 +3452,8 @@ png_combine_row(png_const_structrp png_ptr, png_bytep dp, int display)
|
||||
/* Everything is aligned for png_uint_16 copies, but try for
|
||||
* png_uint_32 first.
|
||||
*/
|
||||
if (png_isaligned(dp, png_uint_32) != 0 &&
|
||||
png_isaligned(sp, png_uint_32) != 0 &&
|
||||
if (png_isaligned(dp, png_uint_32) &&
|
||||
png_isaligned(sp, png_uint_32) &&
|
||||
bytes_to_copy % (sizeof (png_uint_32)) == 0 &&
|
||||
bytes_to_jump % (sizeof (png_uint_32)) == 0)
|
||||
{
|
||||
@ -3567,11 +3573,11 @@ png_combine_row(png_const_structrp png_ptr, png_bytep dp, int display)
|
||||
#ifdef PNG_READ_INTERLACING_SUPPORTED
|
||||
void /* PRIVATE */
|
||||
png_do_read_interlace(png_row_infop row_info, png_bytep row, int pass,
|
||||
png_uint_32 transformations /* Because these may affect the byte layout */)
|
||||
png_uint_32 transformations /* Because these may affect the byte layout */)
|
||||
{
|
||||
/* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */
|
||||
/* Offset to next interlace block */
|
||||
static PNG_CONST int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};
|
||||
static PNG_CONST unsigned int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};
|
||||
|
||||
png_debug(1, "in png_do_read_interlace");
|
||||
if (row != NULL && row_info != NULL)
|
||||
@ -3586,9 +3592,10 @@ png_do_read_interlace(png_row_infop row_info, png_bytep row, int pass,
|
||||
{
|
||||
png_bytep sp = row + (png_size_t)((row_info->width - 1) >> 3);
|
||||
png_bytep dp = row + (png_size_t)((final_width - 1) >> 3);
|
||||
int sshift, dshift;
|
||||
int s_start, s_end, s_inc;
|
||||
int jstop = png_pass_inc[pass];
|
||||
unsigned int sshift, dshift;
|
||||
unsigned int s_start, s_end;
|
||||
int s_inc;
|
||||
int jstop = (int)png_pass_inc[pass];
|
||||
png_byte v;
|
||||
png_uint_32 i;
|
||||
int j;
|
||||
@ -3596,8 +3603,8 @@ png_do_read_interlace(png_row_infop row_info, png_bytep row, int pass,
|
||||
#ifdef PNG_READ_PACKSWAP_SUPPORTED
|
||||
if ((transformations & PNG_PACKSWAP) != 0)
|
||||
{
|
||||
sshift = (int)((row_info->width + 7) & 0x07);
|
||||
dshift = (int)((final_width + 7) & 0x07);
|
||||
sshift = ((row_info->width + 7) & 0x07);
|
||||
dshift = ((final_width + 7) & 0x07);
|
||||
s_start = 7;
|
||||
s_end = 0;
|
||||
s_inc = -1;
|
||||
@ -3606,8 +3613,8 @@ png_do_read_interlace(png_row_infop row_info, png_bytep row, int pass,
|
||||
else
|
||||
#endif
|
||||
{
|
||||
sshift = 7 - (int)((row_info->width + 7) & 0x07);
|
||||
dshift = 7 - (int)((final_width + 7) & 0x07);
|
||||
sshift = 7 - ((row_info->width + 7) & 0x07);
|
||||
dshift = 7 - ((final_width + 7) & 0x07);
|
||||
s_start = 0;
|
||||
s_end = 7;
|
||||
s_inc = 1;
|
||||
@ -3619,7 +3626,7 @@ png_do_read_interlace(png_row_infop row_info, png_bytep row, int pass,
|
||||
for (j = 0; j < jstop; j++)
|
||||
{
|
||||
unsigned int tmp = *dp & (0x7f7f >> (7 - dshift));
|
||||
tmp |= v << dshift;
|
||||
tmp |= (unsigned int)(v << dshift);
|
||||
*dp = (png_byte)(tmp & 0xff);
|
||||
|
||||
if (dshift == s_end)
|
||||
@ -3629,7 +3636,7 @@ png_do_read_interlace(png_row_infop row_info, png_bytep row, int pass,
|
||||
}
|
||||
|
||||
else
|
||||
dshift += s_inc;
|
||||
dshift = (unsigned int)((int)dshift + s_inc);
|
||||
}
|
||||
|
||||
if (sshift == s_end)
|
||||
@ -3639,7 +3646,7 @@ png_do_read_interlace(png_row_infop row_info, png_bytep row, int pass,
|
||||
}
|
||||
|
||||
else
|
||||
sshift += s_inc;
|
||||
sshift = (unsigned int)((int)sshift + s_inc);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -3648,16 +3655,17 @@ png_do_read_interlace(png_row_infop row_info, png_bytep row, int pass,
|
||||
{
|
||||
png_bytep sp = row + (png_uint_32)((row_info->width - 1) >> 2);
|
||||
png_bytep dp = row + (png_uint_32)((final_width - 1) >> 2);
|
||||
int sshift, dshift;
|
||||
int s_start, s_end, s_inc;
|
||||
int jstop = png_pass_inc[pass];
|
||||
unsigned int sshift, dshift;
|
||||
unsigned int s_start, s_end;
|
||||
int s_inc;
|
||||
int jstop = (int)png_pass_inc[pass];
|
||||
png_uint_32 i;
|
||||
|
||||
#ifdef PNG_READ_PACKSWAP_SUPPORTED
|
||||
if ((transformations & PNG_PACKSWAP) != 0)
|
||||
{
|
||||
sshift = (int)(((row_info->width + 3) & 0x03) << 1);
|
||||
dshift = (int)(((final_width + 3) & 0x03) << 1);
|
||||
sshift = (((row_info->width + 3) & 0x03) << 1);
|
||||
dshift = (((final_width + 3) & 0x03) << 1);
|
||||
s_start = 6;
|
||||
s_end = 0;
|
||||
s_inc = -2;
|
||||
@ -3666,8 +3674,8 @@ png_do_read_interlace(png_row_infop row_info, png_bytep row, int pass,
|
||||
else
|
||||
#endif
|
||||
{
|
||||
sshift = (int)((3 - ((row_info->width + 3) & 0x03)) << 1);
|
||||
dshift = (int)((3 - ((final_width + 3) & 0x03)) << 1);
|
||||
sshift = ((3 - ((row_info->width + 3) & 0x03)) << 1);
|
||||
dshift = ((3 - ((final_width + 3) & 0x03)) << 1);
|
||||
s_start = 0;
|
||||
s_end = 6;
|
||||
s_inc = 2;
|
||||
@ -3682,7 +3690,7 @@ png_do_read_interlace(png_row_infop row_info, png_bytep row, int pass,
|
||||
for (j = 0; j < jstop; j++)
|
||||
{
|
||||
unsigned int tmp = *dp & (0x3f3f >> (6 - dshift));
|
||||
tmp |= v << dshift;
|
||||
tmp |= (unsigned int)(v << dshift);
|
||||
*dp = (png_byte)(tmp & 0xff);
|
||||
|
||||
if (dshift == s_end)
|
||||
@ -3692,7 +3700,7 @@ png_do_read_interlace(png_row_infop row_info, png_bytep row, int pass,
|
||||
}
|
||||
|
||||
else
|
||||
dshift += s_inc;
|
||||
dshift = (unsigned int)((int)dshift + s_inc);
|
||||
}
|
||||
|
||||
if (sshift == s_end)
|
||||
@ -3702,7 +3710,7 @@ png_do_read_interlace(png_row_infop row_info, png_bytep row, int pass,
|
||||
}
|
||||
|
||||
else
|
||||
sshift += s_inc;
|
||||
sshift = (unsigned int)((int)sshift + s_inc);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -3711,16 +3719,17 @@ png_do_read_interlace(png_row_infop row_info, png_bytep row, int pass,
|
||||
{
|
||||
png_bytep sp = row + (png_size_t)((row_info->width - 1) >> 1);
|
||||
png_bytep dp = row + (png_size_t)((final_width - 1) >> 1);
|
||||
int sshift, dshift;
|
||||
int s_start, s_end, s_inc;
|
||||
unsigned int sshift, dshift;
|
||||
unsigned int s_start, s_end;
|
||||
int s_inc;
|
||||
png_uint_32 i;
|
||||
int jstop = png_pass_inc[pass];
|
||||
int jstop = (int)png_pass_inc[pass];
|
||||
|
||||
#ifdef PNG_READ_PACKSWAP_SUPPORTED
|
||||
if ((transformations & PNG_PACKSWAP) != 0)
|
||||
{
|
||||
sshift = (int)(((row_info->width + 1) & 0x01) << 2);
|
||||
dshift = (int)(((final_width + 1) & 0x01) << 2);
|
||||
sshift = (((row_info->width + 1) & 0x01) << 2);
|
||||
dshift = (((final_width + 1) & 0x01) << 2);
|
||||
s_start = 4;
|
||||
s_end = 0;
|
||||
s_inc = -4;
|
||||
@ -3729,8 +3738,8 @@ png_do_read_interlace(png_row_infop row_info, png_bytep row, int pass,
|
||||
else
|
||||
#endif
|
||||
{
|
||||
sshift = (int)((1 - ((row_info->width + 1) & 0x01)) << 2);
|
||||
dshift = (int)((1 - ((final_width + 1) & 0x01)) << 2);
|
||||
sshift = ((1 - ((row_info->width + 1) & 0x01)) << 2);
|
||||
dshift = ((1 - ((final_width + 1) & 0x01)) << 2);
|
||||
s_start = 0;
|
||||
s_end = 4;
|
||||
s_inc = 4;
|
||||
@ -3744,7 +3753,7 @@ png_do_read_interlace(png_row_infop row_info, png_bytep row, int pass,
|
||||
for (j = 0; j < jstop; j++)
|
||||
{
|
||||
unsigned int tmp = *dp & (0xf0f >> (4 - dshift));
|
||||
tmp |= v << dshift;
|
||||
tmp |= (unsigned int)(v << dshift);
|
||||
*dp = (png_byte)(tmp & 0xff);
|
||||
|
||||
if (dshift == s_end)
|
||||
@ -3754,7 +3763,7 @@ png_do_read_interlace(png_row_infop row_info, png_bytep row, int pass,
|
||||
}
|
||||
|
||||
else
|
||||
dshift += s_inc;
|
||||
dshift = (unsigned int)((int)dshift + s_inc);
|
||||
}
|
||||
|
||||
if (sshift == s_end)
|
||||
@ -3764,7 +3773,7 @@ png_do_read_interlace(png_row_infop row_info, png_bytep row, int pass,
|
||||
}
|
||||
|
||||
else
|
||||
sshift += s_inc;
|
||||
sshift = (unsigned int)((int)sshift + s_inc);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -3778,7 +3787,7 @@ png_do_read_interlace(png_row_infop row_info, png_bytep row, int pass,
|
||||
|
||||
png_bytep dp = row + (png_size_t)(final_width - 1) * pixel_bytes;
|
||||
|
||||
int jstop = png_pass_inc[pass];
|
||||
int jstop = (int)png_pass_inc[pass];
|
||||
png_uint_32 i;
|
||||
|
||||
for (i = 0; i < row_info->width; i++)
|
||||
@ -3811,7 +3820,7 @@ png_do_read_interlace(png_row_infop row_info, png_bytep row, int pass,
|
||||
|
||||
static void
|
||||
png_read_filter_row_sub(png_row_infop row_info, png_bytep row,
|
||||
png_const_bytep prev_row)
|
||||
png_const_bytep prev_row)
|
||||
{
|
||||
png_size_t i;
|
||||
png_size_t istop = row_info->rowbytes;
|
||||
@ -3829,7 +3838,7 @@ png_read_filter_row_sub(png_row_infop row_info, png_bytep row,
|
||||
|
||||
static void
|
||||
png_read_filter_row_up(png_row_infop row_info, png_bytep row,
|
||||
png_const_bytep prev_row)
|
||||
png_const_bytep prev_row)
|
||||
{
|
||||
png_size_t i;
|
||||
png_size_t istop = row_info->rowbytes;
|
||||
@ -3845,7 +3854,7 @@ png_read_filter_row_up(png_row_infop row_info, png_bytep row,
|
||||
|
||||
static void
|
||||
png_read_filter_row_avg(png_row_infop row_info, png_bytep row,
|
||||
png_const_bytep prev_row)
|
||||
png_const_bytep prev_row)
|
||||
{
|
||||
png_size_t i;
|
||||
png_bytep rp = row;
|
||||
@ -3872,7 +3881,7 @@ png_read_filter_row_avg(png_row_infop row_info, png_bytep row,
|
||||
|
||||
static void
|
||||
png_read_filter_row_paeth_1byte_pixel(png_row_infop row_info, png_bytep row,
|
||||
png_const_bytep prev_row)
|
||||
png_const_bytep prev_row)
|
||||
{
|
||||
png_bytep rp_end = row + row_info->rowbytes;
|
||||
int a, c;
|
||||
@ -3920,9 +3929,9 @@ png_read_filter_row_paeth_1byte_pixel(png_row_infop row_info, png_bytep row,
|
||||
|
||||
static void
|
||||
png_read_filter_row_paeth_multibyte_pixel(png_row_infop row_info, png_bytep row,
|
||||
png_const_bytep prev_row)
|
||||
png_const_bytep prev_row)
|
||||
{
|
||||
int bpp = (row_info->pixel_depth + 7) >> 3;
|
||||
unsigned int bpp = (row_info->pixel_depth + 7) >> 3;
|
||||
png_bytep rp_end = row + bpp;
|
||||
|
||||
/* Process the first pixel in the row completely (this is the same as 'up'
|
||||
@ -3935,7 +3944,7 @@ png_read_filter_row_paeth_multibyte_pixel(png_row_infop row_info, png_bytep row,
|
||||
}
|
||||
|
||||
/* Remainder */
|
||||
rp_end += row_info->rowbytes - bpp;
|
||||
rp_end = rp_end + (row_info->rowbytes - bpp);
|
||||
|
||||
while (row < rp_end)
|
||||
{
|
||||
@ -4005,7 +4014,7 @@ png_init_filter_functions(png_structrp pp)
|
||||
|
||||
void /* PRIVATE */
|
||||
png_read_filter_row(png_structrp pp, png_row_infop row_info, png_bytep row,
|
||||
png_const_bytep prev_row, int filter)
|
||||
png_const_bytep prev_row, int filter)
|
||||
{
|
||||
/* OPTIMIZATION: DO NOT MODIFY THIS FUNCTION, instead #define
|
||||
* PNG_FILTER_OPTIMIZATIONS to a function that overrides the generic
|
||||
@ -4023,7 +4032,7 @@ png_read_filter_row(png_structrp pp, png_row_infop row_info, png_bytep row,
|
||||
#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
|
||||
void /* PRIVATE */
|
||||
png_read_IDAT_data(png_structrp png_ptr, png_bytep output,
|
||||
png_alloc_size_t avail_out)
|
||||
png_alloc_size_t avail_out)
|
||||
{
|
||||
/* Loop reading IDATs and decompressing the result into output[avail_out] */
|
||||
png_ptr->zstream.next_out = output;
|
||||
@ -4280,7 +4289,7 @@ png_read_start_row(png_structrp png_ptr)
|
||||
/* Offset to next interlace block in the y direction */
|
||||
static PNG_CONST png_byte png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2};
|
||||
|
||||
int max_pixel_depth;
|
||||
unsigned int max_pixel_depth;
|
||||
png_size_t row_bytes;
|
||||
|
||||
png_debug(1, "in png_read_start_row");
|
||||
@ -4309,7 +4318,7 @@ png_read_start_row(png_structrp png_ptr)
|
||||
png_ptr->iwidth = png_ptr->width;
|
||||
}
|
||||
|
||||
max_pixel_depth = png_ptr->pixel_depth;
|
||||
max_pixel_depth = (unsigned int)png_ptr->pixel_depth;
|
||||
|
||||
/* WARNING: * png_read_transform_info (pngrtran.c) performs a simpler set of
|
||||
* calculations to calculate the final pixel depth, then
|
||||
@ -4444,7 +4453,7 @@ png_read_start_row(png_structrp png_ptr)
|
||||
defined(PNG_USER_TRANSFORM_PTR_SUPPORTED)
|
||||
if ((png_ptr->transformations & PNG_USER_TRANSFORM) != 0)
|
||||
{
|
||||
int user_pixel_depth = png_ptr->user_transform_depth *
|
||||
unsigned int user_pixel_depth = png_ptr->user_transform_depth *
|
||||
png_ptr->user_transform_channels;
|
||||
|
||||
if (user_pixel_depth > max_pixel_depth)
|
||||
@ -4466,7 +4475,7 @@ defined(PNG_USER_TRANSFORM_PTR_SUPPORTED)
|
||||
* for safety's sake
|
||||
*/
|
||||
row_bytes = PNG_ROWBYTES(max_pixel_depth, row_bytes) +
|
||||
1 + ((max_pixel_depth + 7) >> 3);
|
||||
1 + ((max_pixel_depth + 7) >> 3U);
|
||||
|
||||
#ifdef PNG_MAX_MALLOC_64K
|
||||
if (row_bytes > (png_uint_32)65536L)
|
||||
@ -4475,42 +4484,42 @@ defined(PNG_USER_TRANSFORM_PTR_SUPPORTED)
|
||||
|
||||
if (row_bytes + 48 > png_ptr->old_big_row_buf_size)
|
||||
{
|
||||
png_free(png_ptr, png_ptr->big_row_buf);
|
||||
png_free(png_ptr, png_ptr->big_prev_row);
|
||||
png_free(png_ptr, png_ptr->big_row_buf);
|
||||
png_free(png_ptr, png_ptr->big_prev_row);
|
||||
|
||||
if (png_ptr->interlaced != 0)
|
||||
png_ptr->big_row_buf = (png_bytep)png_calloc(png_ptr,
|
||||
row_bytes + 48);
|
||||
if (png_ptr->interlaced != 0)
|
||||
png_ptr->big_row_buf = (png_bytep)png_calloc(png_ptr,
|
||||
row_bytes + 48);
|
||||
|
||||
else
|
||||
png_ptr->big_row_buf = (png_bytep)png_malloc(png_ptr, row_bytes + 48);
|
||||
else
|
||||
png_ptr->big_row_buf = (png_bytep)png_malloc(png_ptr, row_bytes + 48);
|
||||
|
||||
png_ptr->big_prev_row = (png_bytep)png_malloc(png_ptr, row_bytes + 48);
|
||||
png_ptr->big_prev_row = (png_bytep)png_malloc(png_ptr, row_bytes + 48);
|
||||
|
||||
#ifdef PNG_ALIGNED_MEMORY_SUPPORTED
|
||||
/* Use 16-byte aligned memory for row_buf with at least 16 bytes
|
||||
* of padding before and after row_buf; treat prev_row similarly.
|
||||
* NOTE: the alignment is to the start of the pixels, one beyond the start
|
||||
* of the buffer, because of the filter byte. Prior to libpng 1.5.6 this
|
||||
* was incorrect; the filter byte was aligned, which had the exact
|
||||
* opposite effect of that intended.
|
||||
*/
|
||||
{
|
||||
png_bytep temp = png_ptr->big_row_buf + 32;
|
||||
int extra = (int)((temp - (png_bytep)0) & 0x0f);
|
||||
png_ptr->row_buf = temp - extra - 1/*filter byte*/;
|
||||
/* Use 16-byte aligned memory for row_buf with at least 16 bytes
|
||||
* of padding before and after row_buf; treat prev_row similarly.
|
||||
* NOTE: the alignment is to the start of the pixels, one beyond the start
|
||||
* of the buffer, because of the filter byte. Prior to libpng 1.5.6 this
|
||||
* was incorrect; the filter byte was aligned, which had the exact
|
||||
* opposite effect of that intended.
|
||||
*/
|
||||
{
|
||||
png_bytep temp = png_ptr->big_row_buf + 32;
|
||||
int extra = (int)((temp - (png_bytep)0) & 0x0f);
|
||||
png_ptr->row_buf = temp - extra - 1/*filter byte*/;
|
||||
|
||||
temp = png_ptr->big_prev_row + 32;
|
||||
extra = (int)((temp - (png_bytep)0) & 0x0f);
|
||||
png_ptr->prev_row = temp - extra - 1/*filter byte*/;
|
||||
}
|
||||
temp = png_ptr->big_prev_row + 32;
|
||||
extra = (int)((temp - (png_bytep)0) & 0x0f);
|
||||
png_ptr->prev_row = temp - extra - 1/*filter byte*/;
|
||||
}
|
||||
|
||||
#else
|
||||
/* Use 31 bytes of padding before and 17 bytes after row_buf. */
|
||||
png_ptr->row_buf = png_ptr->big_row_buf + 31;
|
||||
png_ptr->prev_row = png_ptr->big_prev_row + 31;
|
||||
/* Use 31 bytes of padding before and 17 bytes after row_buf. */
|
||||
png_ptr->row_buf = png_ptr->big_row_buf + 31;
|
||||
png_ptr->prev_row = png_ptr->big_prev_row + 31;
|
||||
#endif
|
||||
png_ptr->old_big_row_buf_size = row_bytes + 48;
|
||||
png_ptr->old_big_row_buf_size = row_bytes + 48;
|
||||
}
|
||||
|
||||
#ifdef PNG_MAX_MALLOC_64K
|
||||
@ -4535,7 +4544,7 @@ defined(PNG_USER_TRANSFORM_PTR_SUPPORTED)
|
||||
* does not, so free the read buffer now regardless; the sequential reader
|
||||
* reallocates it on demand.
|
||||
*/
|
||||
if (png_ptr->read_buffer != 0)
|
||||
if (png_ptr->read_buffer != NULL)
|
||||
{
|
||||
png_bytep buffer = png_ptr->read_buffer;
|
||||
|
||||
|
@ -29,7 +29,7 @@
|
||||
* However, the following notice accompanied the original version of this
|
||||
* file and, per its terms, should not be removed:
|
||||
*
|
||||
* Last changed in libpng 1.6.23 [June 9, 2016]
|
||||
* Last changed in libpng 1.6.26 [October 20, 2016]
|
||||
* Copyright (c) 1998-2016 Glenn Randers-Pehrson
|
||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||
@ -132,14 +132,14 @@ png_set_cHRM(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||
double green_x, double green_y, double blue_x, double blue_y)
|
||||
{
|
||||
png_set_cHRM_fixed(png_ptr, info_ptr,
|
||||
png_fixed(png_ptr, white_x, "cHRM White X"),
|
||||
png_fixed(png_ptr, white_y, "cHRM White Y"),
|
||||
png_fixed(png_ptr, red_x, "cHRM Red X"),
|
||||
png_fixed(png_ptr, red_y, "cHRM Red Y"),
|
||||
png_fixed(png_ptr, green_x, "cHRM Green X"),
|
||||
png_fixed(png_ptr, green_y, "cHRM Green Y"),
|
||||
png_fixed(png_ptr, blue_x, "cHRM Blue X"),
|
||||
png_fixed(png_ptr, blue_y, "cHRM Blue Y"));
|
||||
png_fixed(png_ptr, white_x, "cHRM White X"),
|
||||
png_fixed(png_ptr, white_y, "cHRM White Y"),
|
||||
png_fixed(png_ptr, red_x, "cHRM Red X"),
|
||||
png_fixed(png_ptr, red_y, "cHRM Red Y"),
|
||||
png_fixed(png_ptr, green_x, "cHRM Green X"),
|
||||
png_fixed(png_ptr, green_y, "cHRM Green Y"),
|
||||
png_fixed(png_ptr, blue_x, "cHRM Blue X"),
|
||||
png_fixed(png_ptr, blue_y, "cHRM Blue Y"));
|
||||
}
|
||||
|
||||
void PNGAPI
|
||||
@ -148,15 +148,15 @@ png_set_cHRM_XYZ(png_const_structrp png_ptr, png_inforp info_ptr, double red_X,
|
||||
double blue_X, double blue_Y, double blue_Z)
|
||||
{
|
||||
png_set_cHRM_XYZ_fixed(png_ptr, info_ptr,
|
||||
png_fixed(png_ptr, red_X, "cHRM Red X"),
|
||||
png_fixed(png_ptr, red_Y, "cHRM Red Y"),
|
||||
png_fixed(png_ptr, red_Z, "cHRM Red Z"),
|
||||
png_fixed(png_ptr, green_X, "cHRM Green X"),
|
||||
png_fixed(png_ptr, green_Y, "cHRM Green Y"),
|
||||
png_fixed(png_ptr, green_Z, "cHRM Green Z"),
|
||||
png_fixed(png_ptr, blue_X, "cHRM Blue X"),
|
||||
png_fixed(png_ptr, blue_Y, "cHRM Blue Y"),
|
||||
png_fixed(png_ptr, blue_Z, "cHRM Blue Z"));
|
||||
png_fixed(png_ptr, red_X, "cHRM Red X"),
|
||||
png_fixed(png_ptr, red_Y, "cHRM Red Y"),
|
||||
png_fixed(png_ptr, red_Z, "cHRM Red Z"),
|
||||
png_fixed(png_ptr, green_X, "cHRM Green X"),
|
||||
png_fixed(png_ptr, green_Y, "cHRM Green Y"),
|
||||
png_fixed(png_ptr, green_Z, "cHRM Green Z"),
|
||||
png_fixed(png_ptr, blue_X, "cHRM Blue X"),
|
||||
png_fixed(png_ptr, blue_Y, "cHRM Blue Y"),
|
||||
png_fixed(png_ptr, blue_Z, "cHRM Blue Z"));
|
||||
}
|
||||
# endif /* FLOATING_POINT */
|
||||
|
||||
@ -311,17 +311,29 @@ png_set_pCAL(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||
|
||||
/* Check that the type matches the specification. */
|
||||
if (type < 0 || type > 3)
|
||||
png_error(png_ptr, "Invalid pCAL equation type");
|
||||
{
|
||||
png_chunk_report(png_ptr, "Invalid pCAL equation type",
|
||||
PNG_CHUNK_WRITE_ERROR);
|
||||
return;
|
||||
}
|
||||
|
||||
if (nparams < 0 || nparams > 255)
|
||||
png_error(png_ptr, "Invalid pCAL parameter count");
|
||||
{
|
||||
png_chunk_report(png_ptr, "Invalid pCAL parameter count",
|
||||
PNG_CHUNK_WRITE_ERROR);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Validate params[nparams] */
|
||||
for (i=0; i<nparams; ++i)
|
||||
{
|
||||
if (params[i] == NULL ||
|
||||
!png_check_fp_string(params[i], strlen(params[i])))
|
||||
png_error(png_ptr, "Invalid format for pCAL parameter");
|
||||
{
|
||||
png_chunk_report(png_ptr, "Invalid format for pCAL parameter",
|
||||
PNG_CHUNK_WRITE_ERROR);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
info_ptr->pcal_purpose = png_voidcast(png_charp,
|
||||
@ -329,8 +341,8 @@ png_set_pCAL(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||
|
||||
if (info_ptr->pcal_purpose == NULL)
|
||||
{
|
||||
png_warning(png_ptr, "Insufficient memory for pCAL purpose");
|
||||
|
||||
png_chunk_report(png_ptr, "Insufficient memory for pCAL purpose",
|
||||
PNG_CHUNK_WRITE_ERROR);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -344,10 +356,10 @@ png_set_pCAL(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||
|
||||
length = strlen(units) + 1;
|
||||
png_debug1(3, "allocating units for info (%lu bytes)",
|
||||
(unsigned long)length);
|
||||
(unsigned long)length);
|
||||
|
||||
info_ptr->pcal_units = png_voidcast(png_charp,
|
||||
png_malloc_warn(png_ptr, length));
|
||||
png_malloc_warn(png_ptr, length));
|
||||
|
||||
if (info_ptr->pcal_units == NULL)
|
||||
{
|
||||
@ -359,7 +371,7 @@ png_set_pCAL(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||
memcpy(info_ptr->pcal_units, units, length);
|
||||
|
||||
info_ptr->pcal_params = png_voidcast(png_charpp, png_malloc_warn(png_ptr,
|
||||
(png_size_t)((nparams + 1) * (sizeof (png_charp)))));
|
||||
(png_size_t)(((unsigned int)nparams + 1) * (sizeof (png_charp)))));
|
||||
|
||||
if (info_ptr->pcal_params == NULL)
|
||||
{
|
||||
@ -368,7 +380,8 @@ png_set_pCAL(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||
return;
|
||||
}
|
||||
|
||||
memset(info_ptr->pcal_params, 0, (nparams + 1) * (sizeof (png_charp)));
|
||||
memset(info_ptr->pcal_params, 0, ((unsigned int)nparams + 1) *
|
||||
(sizeof (png_charp)));
|
||||
|
||||
for (i = 0; i < nparams; i++)
|
||||
{
|
||||
@ -426,7 +439,7 @@ png_set_sCAL_s(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||
png_debug1(3, "allocating unit for info (%u bytes)", (unsigned int)lengthw);
|
||||
|
||||
info_ptr->scal_s_width = png_voidcast(png_charp,
|
||||
png_malloc_warn(png_ptr, lengthw));
|
||||
png_malloc_warn(png_ptr, lengthw));
|
||||
|
||||
if (info_ptr->scal_s_width == NULL)
|
||||
{
|
||||
@ -442,7 +455,7 @@ png_set_sCAL_s(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||
png_debug1(3, "allocating unit for info (%u bytes)", (unsigned int)lengthh);
|
||||
|
||||
info_ptr->scal_s_height = png_voidcast(png_charp,
|
||||
png_malloc_warn(png_ptr, lengthh));
|
||||
png_malloc_warn(png_ptr, lengthh));
|
||||
|
||||
if (info_ptr->scal_s_height == NULL)
|
||||
{
|
||||
@ -481,9 +494,9 @@ png_set_sCAL(png_const_structrp png_ptr, png_inforp info_ptr, int unit,
|
||||
char sheight[PNG_sCAL_MAX_DIGITS+1];
|
||||
|
||||
png_ascii_from_fp(png_ptr, swidth, (sizeof swidth), width,
|
||||
PNG_sCAL_PRECISION);
|
||||
PNG_sCAL_PRECISION);
|
||||
png_ascii_from_fp(png_ptr, sheight, (sizeof sheight), height,
|
||||
PNG_sCAL_PRECISION);
|
||||
PNG_sCAL_PRECISION);
|
||||
|
||||
png_set_sCAL_s(png_ptr, info_ptr, unit, swidth, sheight);
|
||||
}
|
||||
@ -591,7 +604,8 @@ png_set_PLTE(png_structrp png_ptr, png_inforp info_ptr,
|
||||
PNG_MAX_PALETTE_LENGTH * (sizeof (png_color))));
|
||||
|
||||
if (num_palette > 0)
|
||||
memcpy(png_ptr->palette, palette, num_palette * (sizeof (png_color)));
|
||||
memcpy(png_ptr->palette, palette, (unsigned int)num_palette *
|
||||
(sizeof (png_color)));
|
||||
info_ptr->palette = png_ptr->palette;
|
||||
info_ptr->num_palette = png_ptr->num_palette = (png_uint_16)num_palette;
|
||||
|
||||
@ -676,7 +690,7 @@ png_set_iCCP(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||
*/
|
||||
{
|
||||
int result = png_colorspace_set_ICC(png_ptr, &info_ptr->colorspace, name,
|
||||
proflen, profile, info_ptr->color_type);
|
||||
proflen, profile, info_ptr->color_type);
|
||||
|
||||
png_colorspace_sync_info(png_ptr, info_ptr);
|
||||
|
||||
@ -701,7 +715,7 @@ png_set_iCCP(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||
|
||||
memcpy(new_iccp_name, name, length);
|
||||
new_iccp_profile = png_voidcast(png_bytep,
|
||||
png_malloc_warn(png_ptr, proflen));
|
||||
png_malloc_warn(png_ptr, proflen));
|
||||
|
||||
if (new_iccp_profile == NULL)
|
||||
{
|
||||
@ -776,14 +790,14 @@ png_set_text_2(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||
* the overflow checks.
|
||||
*/
|
||||
new_text = png_voidcast(png_textp,png_realloc_array(png_ptr,
|
||||
info_ptr->text, old_num_text, max_text-old_num_text,
|
||||
sizeof *new_text));
|
||||
info_ptr->text, old_num_text, max_text-old_num_text,
|
||||
sizeof *new_text));
|
||||
}
|
||||
|
||||
if (new_text == NULL)
|
||||
{
|
||||
png_chunk_report(png_ptr, "too many text chunks",
|
||||
PNG_CHUNK_WRITE_ERROR);
|
||||
PNG_CHUNK_WRITE_ERROR);
|
||||
|
||||
return 1;
|
||||
}
|
||||
@ -811,7 +825,7 @@ png_set_text_2(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||
text_ptr[i].compression >= PNG_TEXT_COMPRESSION_LAST)
|
||||
{
|
||||
png_chunk_report(png_ptr, "text compression mode is out of range",
|
||||
PNG_CHUNK_WRITE_ERROR);
|
||||
PNG_CHUNK_WRITE_ERROR);
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -843,7 +857,7 @@ png_set_text_2(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||
# else /* iTXt */
|
||||
{
|
||||
png_chunk_report(png_ptr, "iTXt chunk not supported",
|
||||
PNG_CHUNK_WRITE_ERROR);
|
||||
PNG_CHUNK_WRITE_ERROR);
|
||||
continue;
|
||||
}
|
||||
# endif
|
||||
@ -872,7 +886,7 @@ png_set_text_2(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||
if (textp->key == NULL)
|
||||
{
|
||||
png_chunk_report(png_ptr, "text chunk: out of memory",
|
||||
PNG_CHUNK_WRITE_ERROR);
|
||||
PNG_CHUNK_WRITE_ERROR);
|
||||
|
||||
return 1;
|
||||
}
|
||||
@ -984,7 +998,7 @@ png_set_tRNS(png_structrp png_ptr, png_inforp info_ptr,
|
||||
{
|
||||
/* Changed from num_trans to PNG_MAX_PALETTE_LENGTH in version 1.2.1 */
|
||||
info_ptr->trans_alpha = png_voidcast(png_bytep,
|
||||
png_malloc(png_ptr, PNG_MAX_PALETTE_LENGTH));
|
||||
png_malloc(png_ptr, PNG_MAX_PALETTE_LENGTH));
|
||||
memcpy(info_ptr->trans_alpha, trans_alpha, (png_size_t)num_trans);
|
||||
}
|
||||
png_ptr->trans_alpha = info_ptr->trans_alpha;
|
||||
@ -1004,7 +1018,7 @@ png_set_tRNS(png_structrp png_ptr, png_inforp info_ptr,
|
||||
trans_color->green > sample_max ||
|
||||
trans_color->blue > sample_max)))
|
||||
png_warning(png_ptr,
|
||||
"tRNS chunk has out-of-range samples for bit_depth");
|
||||
"tRNS chunk has out-of-range samples for bit_depth");
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -1046,8 +1060,8 @@ png_set_sPLT(png_const_structrp png_ptr,
|
||||
* overflows. Notice that the parameters are (int) and (size_t)
|
||||
*/
|
||||
np = png_voidcast(png_sPLT_tp,png_realloc_array(png_ptr,
|
||||
info_ptr->splt_palettes, info_ptr->splt_palettes_num, nentries,
|
||||
sizeof *np));
|
||||
info_ptr->splt_palettes, info_ptr->splt_palettes_num, nentries,
|
||||
sizeof *np));
|
||||
|
||||
if (np == NULL)
|
||||
{
|
||||
@ -1108,7 +1122,7 @@ png_set_sPLT(png_const_structrp png_ptr,
|
||||
* checked it when doing the allocation.
|
||||
*/
|
||||
memcpy(np->entries, entries->entries,
|
||||
entries->nentries * sizeof (png_sPLT_entry));
|
||||
(unsigned int)entries->nentries * sizeof (png_sPLT_entry));
|
||||
|
||||
/* Note that 'continue' skips the advance of the out pointer and out
|
||||
* count, so an invalid entry is not added.
|
||||
@ -1138,10 +1152,10 @@ check_location(png_const_structrp png_ptr, int location)
|
||||
{
|
||||
/* Write struct, so unknown chunks come from the app */
|
||||
png_app_warning(png_ptr,
|
||||
"png_set_unknown_chunks now expects a valid location");
|
||||
"png_set_unknown_chunks now expects a valid location");
|
||||
/* Use the old behavior */
|
||||
location = (png_byte)(png_ptr->mode &
|
||||
(PNG_HAVE_IHDR|PNG_HAVE_PLTE|PNG_AFTER_IDAT));
|
||||
(PNG_HAVE_IHDR|PNG_HAVE_PLTE|PNG_AFTER_IDAT));
|
||||
}
|
||||
|
||||
/* This need not be an internal error - if the app calls
|
||||
@ -1164,7 +1178,7 @@ check_location(png_const_structrp png_ptr, int location)
|
||||
|
||||
void PNGAPI
|
||||
png_set_unknown_chunks(png_const_structrp png_ptr,
|
||||
png_inforp info_ptr, png_const_unknown_chunkp unknowns, int num_unknowns)
|
||||
png_inforp info_ptr, png_const_unknown_chunkp unknowns, int num_unknowns)
|
||||
{
|
||||
png_unknown_chunkp np;
|
||||
|
||||
@ -1203,13 +1217,13 @@ png_set_unknown_chunks(png_const_structrp png_ptr,
|
||||
* appropriate to read or write.
|
||||
*/
|
||||
np = png_voidcast(png_unknown_chunkp, png_realloc_array(png_ptr,
|
||||
info_ptr->unknown_chunks, info_ptr->unknown_chunks_num, num_unknowns,
|
||||
sizeof *np));
|
||||
info_ptr->unknown_chunks, info_ptr->unknown_chunks_num, num_unknowns,
|
||||
sizeof *np));
|
||||
|
||||
if (np == NULL)
|
||||
{
|
||||
png_chunk_report(png_ptr, "too many unknown chunks",
|
||||
PNG_CHUNK_WRITE_ERROR);
|
||||
PNG_CHUNK_WRITE_ERROR);
|
||||
|
||||
return;
|
||||
}
|
||||
@ -1238,12 +1252,12 @@ png_set_unknown_chunks(png_const_structrp png_ptr,
|
||||
else
|
||||
{
|
||||
np->data = png_voidcast(png_bytep,
|
||||
png_malloc_base(png_ptr, unknowns->size));
|
||||
png_malloc_base(png_ptr, unknowns->size));
|
||||
|
||||
if (np->data == NULL)
|
||||
{
|
||||
png_chunk_report(png_ptr, "unknown chunk: out of memory",
|
||||
PNG_CHUNK_WRITE_ERROR);
|
||||
PNG_CHUNK_WRITE_ERROR);
|
||||
/* But just skip storing the unknown chunk */
|
||||
continue;
|
||||
}
|
||||
@ -1277,7 +1291,7 @@ png_set_unknown_chunk_location(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||
{
|
||||
png_app_error(png_ptr, "invalid unknown chunk location");
|
||||
/* Fake out the pre 1.6.0 behavior: */
|
||||
if ((location & PNG_HAVE_IDAT) != 0) /* undocumented! */
|
||||
if (((unsigned int)location & PNG_HAVE_IDAT) != 0) /* undocumented! */
|
||||
location = PNG_AFTER_IDAT;
|
||||
|
||||
else
|
||||
@ -1401,7 +1415,7 @@ png_set_keep_unknown_chunks(png_structrp png_ptr, int keep,
|
||||
return;
|
||||
}
|
||||
|
||||
num_chunks = num_chunks_in;
|
||||
num_chunks = (unsigned int)num_chunks_in;
|
||||
}
|
||||
|
||||
old_num_chunks = png_ptr->num_chunk_list;
|
||||
@ -1450,7 +1464,7 @@ png_set_keep_unknown_chunks(png_structrp png_ptr, int keep,
|
||||
for (i=0; i<num_chunks; ++i)
|
||||
{
|
||||
old_num_chunks = add_one_chunk(new_list, old_num_chunks,
|
||||
chunk_list+5*i, keep);
|
||||
chunk_list+5*i, keep);
|
||||
}
|
||||
|
||||
/* Now remove any spurious 'default' entries. */
|
||||
@ -1530,60 +1544,60 @@ png_set_rows(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||
void PNGAPI
|
||||
png_set_compression_buffer_size(png_structrp png_ptr, png_size_t size)
|
||||
{
|
||||
if (png_ptr == NULL)
|
||||
return;
|
||||
if (png_ptr == NULL)
|
||||
return;
|
||||
|
||||
if (size == 0 || size > PNG_UINT_31_MAX)
|
||||
png_error(png_ptr, "invalid compression buffer size");
|
||||
if (size == 0 || size > PNG_UINT_31_MAX)
|
||||
png_error(png_ptr, "invalid compression buffer size");
|
||||
|
||||
# ifdef PNG_SEQUENTIAL_READ_SUPPORTED
|
||||
if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0)
|
||||
{
|
||||
png_ptr->IDAT_read_size = (png_uint_32)size; /* checked above */
|
||||
return;
|
||||
}
|
||||
if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0)
|
||||
{
|
||||
png_ptr->IDAT_read_size = (png_uint_32)size; /* checked above */
|
||||
return;
|
||||
}
|
||||
# endif
|
||||
|
||||
# ifdef PNG_WRITE_SUPPORTED
|
||||
if ((png_ptr->mode & PNG_IS_READ_STRUCT) == 0)
|
||||
if ((png_ptr->mode & PNG_IS_READ_STRUCT) == 0)
|
||||
{
|
||||
if (png_ptr->zowner != 0)
|
||||
{
|
||||
if (png_ptr->zowner != 0)
|
||||
{
|
||||
png_warning(png_ptr,
|
||||
"Compression buffer size cannot be changed because it is in use");
|
||||
png_warning(png_ptr,
|
||||
"Compression buffer size cannot be changed because it is in use");
|
||||
|
||||
return;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
#ifndef __COVERITY__
|
||||
/* Some compilers complain that this is always false. However, it
|
||||
* can be true when integer overflow happens.
|
||||
*/
|
||||
if (size > ZLIB_IO_MAX)
|
||||
{
|
||||
png_warning(png_ptr,
|
||||
"Compression buffer size limited to system maximum");
|
||||
size = ZLIB_IO_MAX; /* must fit */
|
||||
}
|
||||
/* Some compilers complain that this is always false. However, it
|
||||
* can be true when integer overflow happens.
|
||||
*/
|
||||
if (size > ZLIB_IO_MAX)
|
||||
{
|
||||
png_warning(png_ptr,
|
||||
"Compression buffer size limited to system maximum");
|
||||
size = ZLIB_IO_MAX; /* must fit */
|
||||
}
|
||||
#endif
|
||||
|
||||
if (size < 6)
|
||||
{
|
||||
/* Deflate will potentially go into an infinite loop on a SYNC_FLUSH
|
||||
* if this is permitted.
|
||||
*/
|
||||
png_warning(png_ptr,
|
||||
"Compression buffer size cannot be reduced below 6");
|
||||
if (size < 6)
|
||||
{
|
||||
/* Deflate will potentially go into an infinite loop on a SYNC_FLUSH
|
||||
* if this is permitted.
|
||||
*/
|
||||
png_warning(png_ptr,
|
||||
"Compression buffer size cannot be reduced below 6");
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (png_ptr->zbuffer_size != size)
|
||||
{
|
||||
png_free_buffer_list(png_ptr, &png_ptr->zbuffer_list);
|
||||
png_ptr->zbuffer_size = (uInt)size;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (png_ptr->zbuffer_size != size)
|
||||
{
|
||||
png_free_buffer_list(png_ptr, &png_ptr->zbuffer_list);
|
||||
png_ptr->zbuffer_size = (uInt)size;
|
||||
}
|
||||
}
|
||||
# endif
|
||||
}
|
||||
|
||||
@ -1591,7 +1605,7 @@ void PNGAPI
|
||||
png_set_invalid(png_const_structrp png_ptr, png_inforp info_ptr, int mask)
|
||||
{
|
||||
if (png_ptr != NULL && info_ptr != NULL)
|
||||
info_ptr->valid &= ~mask;
|
||||
info_ptr->valid &= (unsigned int)(~mask);
|
||||
}
|
||||
|
||||
|
||||
@ -1690,7 +1704,9 @@ png_set_check_for_invalid_index(png_structrp png_ptr, int allowed)
|
||||
png_uint_32 /* PRIVATE */
|
||||
png_check_keyword(png_structrp png_ptr, png_const_charp key, png_bytep new_key)
|
||||
{
|
||||
#ifdef PNG_WARNINGS_SUPPORTED
|
||||
png_const_charp orig_key = key;
|
||||
#endif
|
||||
png_uint_32 key_len = 0;
|
||||
int bad_character = 0;
|
||||
int space = 1;
|
||||
@ -1753,7 +1769,9 @@ png_check_keyword(png_structrp png_ptr, png_const_charp key, png_bytep new_key)
|
||||
|
||||
png_formatted_warning(png_ptr, p, "keyword \"@1\": bad character '0x@2'");
|
||||
}
|
||||
#endif /* WARNINGS */
|
||||
#else /* !WARNINGS */
|
||||
PNG_UNUSED(png_ptr)
|
||||
#endif /* !WARNINGS */
|
||||
|
||||
return key_len;
|
||||
}
|
||||
|
@ -29,8 +29,8 @@
|
||||
* However, the following notice accompanied the original version of this
|
||||
* file and, per its terms, should not be removed:
|
||||
*
|
||||
* Last changed in libpng 1.6.18 [July 23, 2015]
|
||||
* Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson
|
||||
* Last changed in libpng 1.6.28 [January 5, 2017]
|
||||
* Copyright (c) 1998-2002,2004,2006-2017 Glenn Randers-Pehrson
|
||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||
*
|
||||
@ -277,7 +277,7 @@ struct png_struct_def
|
||||
png_byte filter; /* file filter type (always 0) */
|
||||
png_byte interlaced; /* PNG_INTERLACE_NONE, PNG_INTERLACE_ADAM7 */
|
||||
png_byte pass; /* current interlace pass (0 - 6) */
|
||||
png_byte do_filter; /* row filter flags (see PNG_FILTER_ below ) */
|
||||
png_byte do_filter; /* row filter flags (see PNG_FILTER_ in png.h ) */
|
||||
png_byte color_type; /* color type of file */
|
||||
png_byte bit_depth; /* bit depth of file */
|
||||
png_byte usr_bit_depth; /* bit depth of users row: write only */
|
||||
@ -291,7 +291,7 @@ struct png_struct_def
|
||||
/* pixel depth used for the row buffers */
|
||||
png_byte transformed_pixel_depth;
|
||||
/* pixel depth after read/write transforms */
|
||||
#if PNG_ZLIB_VERNUM >= 0x1240
|
||||
#if ZLIB_VERNUM >= 0x1240
|
||||
png_byte zstream_start; /* at start of an input zlib stream */
|
||||
#endif /* Zlib >= 1.2.4 */
|
||||
#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED)
|
||||
@ -381,7 +381,7 @@ struct png_struct_def
|
||||
|
||||
/* Options */
|
||||
#ifdef PNG_SET_OPTION_SUPPORTED
|
||||
png_byte options; /* On/off state (up to 4 options) */
|
||||
png_uint_32 options; /* On/off state (up to 16 options) */
|
||||
#endif
|
||||
|
||||
#if PNG_LIBPNG_VER < 10700
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -29,8 +29,8 @@
|
||||
* However, the following notice accompanied the original version of this
|
||||
* file and, per its terms, should not be removed:
|
||||
*
|
||||
* Last changed in libpng 1.6.18 [July 23, 2015]
|
||||
* Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson
|
||||
* Last changed in libpng 1.6.26 [October 20, 2016]
|
||||
* Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson
|
||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||
*
|
||||
@ -200,13 +200,14 @@ png_set_filler(png_structrp png_ptr, png_uint_32 filler, int filler_loc)
|
||||
* size!
|
||||
*/
|
||||
png_app_error(png_ptr,
|
||||
"png_set_filler is invalid for low bit depth gray output");
|
||||
"png_set_filler is invalid for"
|
||||
" low bit depth gray output");
|
||||
return;
|
||||
}
|
||||
|
||||
default:
|
||||
png_app_error(png_ptr,
|
||||
"png_set_filler: inappropriate color type");
|
||||
"png_set_filler: inappropriate color type");
|
||||
return;
|
||||
}
|
||||
# else
|
||||
@ -622,7 +623,7 @@ png_do_strip_channel(png_row_infop row_info, png_bytep row, int at_start)
|
||||
return; /* The filler channel has gone already */
|
||||
|
||||
/* Fix the rowbytes value. */
|
||||
row_info->rowbytes = dp-row;
|
||||
row_info->rowbytes = (unsigned int)(dp-row);
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -720,7 +721,7 @@ png_do_check_palette_indexes(png_structrp png_ptr, png_row_infop row_info)
|
||||
* and this calculation is used because it avoids warnings that other
|
||||
* forms produced on either GCC or MSVC.
|
||||
*/
|
||||
int padding = (-row_info->pixel_depth * row_info->width) & 7;
|
||||
int padding = PNG_PADBITS(row_info->pixel_depth, row_info->width);
|
||||
png_bytep rp = png_ptr->row_buf + row_info->rowbytes;
|
||||
|
||||
switch (row_info->bit_depth)
|
||||
@ -825,7 +826,7 @@ png_set_user_transform_info(png_structrp png_ptr, png_voidp
|
||||
(png_ptr->flags & PNG_FLAG_ROW_INIT) != 0)
|
||||
{
|
||||
png_app_error(png_ptr,
|
||||
"info change after png_start_read_image or png_read_update_info");
|
||||
"info change after png_start_read_image or png_read_update_info");
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
@ -1,196 +0,0 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/* pngwio.c - functions for data output
|
||||
*
|
||||
* This file is available under and governed by the GNU General Public
|
||||
* License version 2 only, as published by the Free Software Foundation.
|
||||
* However, the following notice accompanied the original version of this
|
||||
* file and, per its terms, should not be removed:
|
||||
*
|
||||
* Last changed in libpng 1.6.15 [November 20, 2014]
|
||||
* Copyright (c) 1998-2002,2004,2006-2014 Glenn Randers-Pehrson
|
||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||
*
|
||||
* This code is released under the libpng license.
|
||||
* For conditions of distribution and use, see the disclaimer
|
||||
* and license in png.h
|
||||
*
|
||||
* This file provides a location for all output. Users who need
|
||||
* special handling are expected to write functions that have the same
|
||||
* arguments as these and perform similar functions, but that possibly
|
||||
* use different output methods. Note that you shouldn't change these
|
||||
* functions, but rather write replacement functions and then change
|
||||
* them at run time with png_set_write_fn(...).
|
||||
*/
|
||||
|
||||
#include "pngpriv.h"
|
||||
|
||||
#ifdef PNG_WRITE_SUPPORTED
|
||||
|
||||
/* Write the data to whatever output you are using. The default routine
|
||||
* writes to a file pointer. Note that this routine sometimes gets called
|
||||
* with very small lengths, so you should implement some kind of simple
|
||||
* buffering if you are using unbuffered writes. This should never be asked
|
||||
* to write more than 64K on a 16-bit machine.
|
||||
*/
|
||||
|
||||
void /* PRIVATE */
|
||||
png_write_data(png_structrp png_ptr, png_const_bytep data, png_size_t length)
|
||||
{
|
||||
/* NOTE: write_data_fn must not change the buffer! */
|
||||
if (png_ptr->write_data_fn != NULL )
|
||||
(*(png_ptr->write_data_fn))(png_ptr, png_constcast(png_bytep,data),
|
||||
length);
|
||||
|
||||
else
|
||||
png_error(png_ptr, "Call to NULL write function");
|
||||
}
|
||||
|
||||
#ifdef PNG_STDIO_SUPPORTED
|
||||
/* This is the function that does the actual writing of data. If you are
|
||||
* not writing to a standard C stream, you should create a replacement
|
||||
* write_data function and use it at run time with png_set_write_fn(), rather
|
||||
* than changing the library.
|
||||
*/
|
||||
void PNGCBAPI
|
||||
png_default_write_data(png_structp png_ptr, png_bytep data, png_size_t length)
|
||||
{
|
||||
png_size_t check;
|
||||
|
||||
if (png_ptr == NULL)
|
||||
return;
|
||||
|
||||
check = fwrite(data, 1, length, (png_FILE_p)(png_ptr->io_ptr));
|
||||
|
||||
if (check != length)
|
||||
png_error(png_ptr, "Write Error");
|
||||
}
|
||||
#endif
|
||||
|
||||
/* This function is called to output any data pending writing (normally
|
||||
* to disk). After png_flush is called, there should be no data pending
|
||||
* writing in any buffers.
|
||||
*/
|
||||
#ifdef PNG_WRITE_FLUSH_SUPPORTED
|
||||
void /* PRIVATE */
|
||||
png_flush(png_structrp png_ptr)
|
||||
{
|
||||
if (png_ptr->output_flush_fn != NULL)
|
||||
(*(png_ptr->output_flush_fn))(png_ptr);
|
||||
}
|
||||
|
||||
# ifdef PNG_STDIO_SUPPORTED
|
||||
void PNGCBAPI
|
||||
png_default_flush(png_structp png_ptr)
|
||||
{
|
||||
png_FILE_p io_ptr;
|
||||
|
||||
if (png_ptr == NULL)
|
||||
return;
|
||||
|
||||
io_ptr = png_voidcast(png_FILE_p, (png_ptr->io_ptr));
|
||||
fflush(io_ptr);
|
||||
}
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* This function allows the application to supply new output functions for
|
||||
* libpng if standard C streams aren't being used.
|
||||
*
|
||||
* This function takes as its arguments:
|
||||
* png_ptr - pointer to a png output data structure
|
||||
* io_ptr - pointer to user supplied structure containing info about
|
||||
* the output functions. May be NULL.
|
||||
* write_data_fn - pointer to a new output function that takes as its
|
||||
* arguments a pointer to a png_struct, a pointer to
|
||||
* data to be written, and a 32-bit unsigned int that is
|
||||
* the number of bytes to be written. The new write
|
||||
* function should call png_error(png_ptr, "Error msg")
|
||||
* to exit and output any fatal error messages. May be
|
||||
* NULL, in which case libpng's default function will
|
||||
* be used.
|
||||
* flush_data_fn - pointer to a new flush function that takes as its
|
||||
* arguments a pointer to a png_struct. After a call to
|
||||
* the flush function, there should be no data in any buffers
|
||||
* or pending transmission. If the output method doesn't do
|
||||
* any buffering of output, a function prototype must still be
|
||||
* supplied although it doesn't have to do anything. If
|
||||
* PNG_WRITE_FLUSH_SUPPORTED is not defined at libpng compile
|
||||
* time, output_flush_fn will be ignored, although it must be
|
||||
* supplied for compatibility. May be NULL, in which case
|
||||
* libpng's default function will be used, if
|
||||
* PNG_WRITE_FLUSH_SUPPORTED is defined. This is not
|
||||
* a good idea if io_ptr does not point to a standard
|
||||
* *FILE structure.
|
||||
*/
|
||||
void PNGAPI
|
||||
png_set_write_fn(png_structrp png_ptr, png_voidp io_ptr,
|
||||
png_rw_ptr write_data_fn, png_flush_ptr output_flush_fn)
|
||||
{
|
||||
if (png_ptr == NULL)
|
||||
return;
|
||||
|
||||
png_ptr->io_ptr = io_ptr;
|
||||
|
||||
#ifdef PNG_STDIO_SUPPORTED
|
||||
if (write_data_fn != NULL)
|
||||
png_ptr->write_data_fn = write_data_fn;
|
||||
|
||||
else
|
||||
png_ptr->write_data_fn = png_default_write_data;
|
||||
#else
|
||||
png_ptr->write_data_fn = write_data_fn;
|
||||
#endif
|
||||
|
||||
#ifdef PNG_WRITE_FLUSH_SUPPORTED
|
||||
# ifdef PNG_STDIO_SUPPORTED
|
||||
|
||||
if (output_flush_fn != NULL)
|
||||
png_ptr->output_flush_fn = output_flush_fn;
|
||||
|
||||
else
|
||||
png_ptr->output_flush_fn = png_default_flush;
|
||||
|
||||
# else
|
||||
png_ptr->output_flush_fn = output_flush_fn;
|
||||
# endif
|
||||
#else
|
||||
PNG_UNUSED(output_flush_fn)
|
||||
#endif /* WRITE_FLUSH */
|
||||
|
||||
#ifdef PNG_READ_SUPPORTED
|
||||
/* It is an error to read while writing a png file */
|
||||
if (png_ptr->read_data_fn != NULL)
|
||||
{
|
||||
png_ptr->read_data_fn = NULL;
|
||||
|
||||
png_warning(png_ptr,
|
||||
"Can't set both read_data_fn and write_data_fn in the"
|
||||
" same structure");
|
||||
}
|
||||
#endif
|
||||
}
|
||||
#endif /* WRITE */
|
File diff suppressed because it is too large
Load Diff
@ -1,604 +0,0 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/* pngwtran.c - transforms the data in a row for PNG writers
|
||||
*
|
||||
* This file is available under and governed by the GNU General Public
|
||||
* License version 2 only, as published by the Free Software Foundation.
|
||||
* However, the following notice accompanied the original version of this
|
||||
* file and, per its terms, should not be removed:
|
||||
*
|
||||
* Last changed in libpng 1.6.18 [July 23, 2015]
|
||||
* Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson
|
||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||
*
|
||||
* This code is released under the libpng license.
|
||||
* For conditions of distribution and use, see the disclaimer
|
||||
* and license in png.h
|
||||
*/
|
||||
|
||||
#include "pngpriv.h"
|
||||
|
||||
#ifdef PNG_WRITE_SUPPORTED
|
||||
#ifdef PNG_WRITE_TRANSFORMS_SUPPORTED
|
||||
|
||||
#ifdef PNG_WRITE_PACK_SUPPORTED
|
||||
/* Pack pixels into bytes. Pass the true bit depth in bit_depth. The
|
||||
* row_info bit depth should be 8 (one pixel per byte). The channels
|
||||
* should be 1 (this only happens on grayscale and paletted images).
|
||||
*/
|
||||
static void
|
||||
png_do_pack(png_row_infop row_info, png_bytep row, png_uint_32 bit_depth)
|
||||
{
|
||||
png_debug(1, "in png_do_pack");
|
||||
|
||||
if (row_info->bit_depth == 8 &&
|
||||
row_info->channels == 1)
|
||||
{
|
||||
switch ((int)bit_depth)
|
||||
{
|
||||
case 1:
|
||||
{
|
||||
png_bytep sp, dp;
|
||||
int mask, v;
|
||||
png_uint_32 i;
|
||||
png_uint_32 row_width = row_info->width;
|
||||
|
||||
sp = row;
|
||||
dp = row;
|
||||
mask = 0x80;
|
||||
v = 0;
|
||||
|
||||
for (i = 0; i < row_width; i++)
|
||||
{
|
||||
if (*sp != 0)
|
||||
v |= mask;
|
||||
|
||||
sp++;
|
||||
|
||||
if (mask > 1)
|
||||
mask >>= 1;
|
||||
|
||||
else
|
||||
{
|
||||
mask = 0x80;
|
||||
*dp = (png_byte)v;
|
||||
dp++;
|
||||
v = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (mask != 0x80)
|
||||
*dp = (png_byte)v;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 2:
|
||||
{
|
||||
png_bytep sp, dp;
|
||||
unsigned int shift;
|
||||
int v;
|
||||
png_uint_32 i;
|
||||
png_uint_32 row_width = row_info->width;
|
||||
|
||||
sp = row;
|
||||
dp = row;
|
||||
shift = 6;
|
||||
v = 0;
|
||||
|
||||
for (i = 0; i < row_width; i++)
|
||||
{
|
||||
png_byte value;
|
||||
|
||||
value = (png_byte)(*sp & 0x03);
|
||||
v |= (value << shift);
|
||||
|
||||
if (shift == 0)
|
||||
{
|
||||
shift = 6;
|
||||
*dp = (png_byte)v;
|
||||
dp++;
|
||||
v = 0;
|
||||
}
|
||||
|
||||
else
|
||||
shift -= 2;
|
||||
|
||||
sp++;
|
||||
}
|
||||
|
||||
if (shift != 6)
|
||||
*dp = (png_byte)v;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 4:
|
||||
{
|
||||
png_bytep sp, dp;
|
||||
unsigned int shift;
|
||||
int v;
|
||||
png_uint_32 i;
|
||||
png_uint_32 row_width = row_info->width;
|
||||
|
||||
sp = row;
|
||||
dp = row;
|
||||
shift = 4;
|
||||
v = 0;
|
||||
|
||||
for (i = 0; i < row_width; i++)
|
||||
{
|
||||
png_byte value;
|
||||
|
||||
value = (png_byte)(*sp & 0x0f);
|
||||
v |= (value << shift);
|
||||
|
||||
if (shift == 0)
|
||||
{
|
||||
shift = 4;
|
||||
*dp = (png_byte)v;
|
||||
dp++;
|
||||
v = 0;
|
||||
}
|
||||
|
||||
else
|
||||
shift -= 4;
|
||||
|
||||
sp++;
|
||||
}
|
||||
|
||||
if (shift != 4)
|
||||
*dp = (png_byte)v;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
row_info->bit_depth = (png_byte)bit_depth;
|
||||
row_info->pixel_depth = (png_byte)(bit_depth * row_info->channels);
|
||||
row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth,
|
||||
row_info->width);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef PNG_WRITE_SHIFT_SUPPORTED
|
||||
/* Shift pixel values to take advantage of whole range. Pass the
|
||||
* true number of bits in bit_depth. The row should be packed
|
||||
* according to row_info->bit_depth. Thus, if you had a row of
|
||||
* bit depth 4, but the pixels only had values from 0 to 7, you
|
||||
* would pass 3 as bit_depth, and this routine would translate the
|
||||
* data to 0 to 15.
|
||||
*/
|
||||
static void
|
||||
png_do_shift(png_row_infop row_info, png_bytep row,
|
||||
png_const_color_8p bit_depth)
|
||||
{
|
||||
png_debug(1, "in png_do_shift");
|
||||
|
||||
if (row_info->color_type != PNG_COLOR_TYPE_PALETTE)
|
||||
{
|
||||
int shift_start[4], shift_dec[4];
|
||||
int channels = 0;
|
||||
|
||||
if ((row_info->color_type & PNG_COLOR_MASK_COLOR) != 0)
|
||||
{
|
||||
shift_start[channels] = row_info->bit_depth - bit_depth->red;
|
||||
shift_dec[channels] = bit_depth->red;
|
||||
channels++;
|
||||
|
||||
shift_start[channels] = row_info->bit_depth - bit_depth->green;
|
||||
shift_dec[channels] = bit_depth->green;
|
||||
channels++;
|
||||
|
||||
shift_start[channels] = row_info->bit_depth - bit_depth->blue;
|
||||
shift_dec[channels] = bit_depth->blue;
|
||||
channels++;
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
shift_start[channels] = row_info->bit_depth - bit_depth->gray;
|
||||
shift_dec[channels] = bit_depth->gray;
|
||||
channels++;
|
||||
}
|
||||
|
||||
if ((row_info->color_type & PNG_COLOR_MASK_ALPHA) != 0)
|
||||
{
|
||||
shift_start[channels] = row_info->bit_depth - bit_depth->alpha;
|
||||
shift_dec[channels] = bit_depth->alpha;
|
||||
channels++;
|
||||
}
|
||||
|
||||
/* With low row depths, could only be grayscale, so one channel */
|
||||
if (row_info->bit_depth < 8)
|
||||
{
|
||||
png_bytep bp = row;
|
||||
png_size_t i;
|
||||
unsigned int mask;
|
||||
png_size_t row_bytes = row_info->rowbytes;
|
||||
|
||||
if (bit_depth->gray == 1 && row_info->bit_depth == 2)
|
||||
mask = 0x55;
|
||||
|
||||
else if (row_info->bit_depth == 4 && bit_depth->gray == 3)
|
||||
mask = 0x11;
|
||||
|
||||
else
|
||||
mask = 0xff;
|
||||
|
||||
for (i = 0; i < row_bytes; i++, bp++)
|
||||
{
|
||||
int j;
|
||||
unsigned int v, out;
|
||||
|
||||
v = *bp;
|
||||
out = 0;
|
||||
|
||||
for (j = shift_start[0]; j > -shift_dec[0]; j -= shift_dec[0])
|
||||
{
|
||||
if (j > 0)
|
||||
out |= v << j;
|
||||
|
||||
else
|
||||
out |= (v >> (-j)) & mask;
|
||||
}
|
||||
|
||||
*bp = (png_byte)(out & 0xff);
|
||||
}
|
||||
}
|
||||
|
||||
else if (row_info->bit_depth == 8)
|
||||
{
|
||||
png_bytep bp = row;
|
||||
png_uint_32 i;
|
||||
png_uint_32 istop = channels * row_info->width;
|
||||
|
||||
for (i = 0; i < istop; i++, bp++)
|
||||
{
|
||||
|
||||
const unsigned int c = i%channels;
|
||||
int j;
|
||||
unsigned int v, out;
|
||||
|
||||
v = *bp;
|
||||
out = 0;
|
||||
|
||||
for (j = shift_start[c]; j > -shift_dec[c]; j -= shift_dec[c])
|
||||
{
|
||||
if (j > 0)
|
||||
out |= v << j;
|
||||
|
||||
else
|
||||
out |= v >> (-j);
|
||||
}
|
||||
|
||||
*bp = (png_byte)(out & 0xff);
|
||||
}
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
png_bytep bp;
|
||||
png_uint_32 i;
|
||||
png_uint_32 istop = channels * row_info->width;
|
||||
|
||||
for (bp = row, i = 0; i < istop; i++)
|
||||
{
|
||||
const unsigned int c = i%channels;
|
||||
int j;
|
||||
unsigned int value, v;
|
||||
|
||||
v = png_get_uint_16(bp);
|
||||
value = 0;
|
||||
|
||||
for (j = shift_start[c]; j > -shift_dec[c]; j -= shift_dec[c])
|
||||
{
|
||||
if (j > 0)
|
||||
value |= v << j;
|
||||
|
||||
else
|
||||
value |= v >> (-j);
|
||||
}
|
||||
*bp++ = (png_byte)((value >> 8) & 0xff);
|
||||
*bp++ = (png_byte)(value & 0xff);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef PNG_WRITE_SWAP_ALPHA_SUPPORTED
|
||||
static void
|
||||
png_do_write_swap_alpha(png_row_infop row_info, png_bytep row)
|
||||
{
|
||||
png_debug(1, "in png_do_write_swap_alpha");
|
||||
|
||||
{
|
||||
if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
|
||||
{
|
||||
if (row_info->bit_depth == 8)
|
||||
{
|
||||
/* This converts from ARGB to RGBA */
|
||||
png_bytep sp, dp;
|
||||
png_uint_32 i;
|
||||
png_uint_32 row_width = row_info->width;
|
||||
|
||||
for (i = 0, sp = dp = row; i < row_width; i++)
|
||||
{
|
||||
png_byte save = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = save;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef PNG_WRITE_16BIT_SUPPORTED
|
||||
else
|
||||
{
|
||||
/* This converts from AARRGGBB to RRGGBBAA */
|
||||
png_bytep sp, dp;
|
||||
png_uint_32 i;
|
||||
png_uint_32 row_width = row_info->width;
|
||||
|
||||
for (i = 0, sp = dp = row; i < row_width; i++)
|
||||
{
|
||||
png_byte save[2];
|
||||
save[0] = *(sp++);
|
||||
save[1] = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = save[0];
|
||||
*(dp++) = save[1];
|
||||
}
|
||||
}
|
||||
#endif /* WRITE_16BIT */
|
||||
}
|
||||
|
||||
else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
|
||||
{
|
||||
if (row_info->bit_depth == 8)
|
||||
{
|
||||
/* This converts from AG to GA */
|
||||
png_bytep sp, dp;
|
||||
png_uint_32 i;
|
||||
png_uint_32 row_width = row_info->width;
|
||||
|
||||
for (i = 0, sp = dp = row; i < row_width; i++)
|
||||
{
|
||||
png_byte save = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = save;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef PNG_WRITE_16BIT_SUPPORTED
|
||||
else
|
||||
{
|
||||
/* This converts from AAGG to GGAA */
|
||||
png_bytep sp, dp;
|
||||
png_uint_32 i;
|
||||
png_uint_32 row_width = row_info->width;
|
||||
|
||||
for (i = 0, sp = dp = row; i < row_width; i++)
|
||||
{
|
||||
png_byte save[2];
|
||||
save[0] = *(sp++);
|
||||
save[1] = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = save[0];
|
||||
*(dp++) = save[1];
|
||||
}
|
||||
}
|
||||
#endif /* WRITE_16BIT */
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef PNG_WRITE_INVERT_ALPHA_SUPPORTED
|
||||
static void
|
||||
png_do_write_invert_alpha(png_row_infop row_info, png_bytep row)
|
||||
{
|
||||
png_debug(1, "in png_do_write_invert_alpha");
|
||||
|
||||
{
|
||||
if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
|
||||
{
|
||||
if (row_info->bit_depth == 8)
|
||||
{
|
||||
/* This inverts the alpha channel in RGBA */
|
||||
png_bytep sp, dp;
|
||||
png_uint_32 i;
|
||||
png_uint_32 row_width = row_info->width;
|
||||
|
||||
for (i = 0, sp = dp = row; i < row_width; i++)
|
||||
{
|
||||
/* Does nothing
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*/
|
||||
sp+=3; dp = sp;
|
||||
*dp = (png_byte)(255 - *(sp++));
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef PNG_WRITE_16BIT_SUPPORTED
|
||||
else
|
||||
{
|
||||
/* This inverts the alpha channel in RRGGBBAA */
|
||||
png_bytep sp, dp;
|
||||
png_uint_32 i;
|
||||
png_uint_32 row_width = row_info->width;
|
||||
|
||||
for (i = 0, sp = dp = row; i < row_width; i++)
|
||||
{
|
||||
/* Does nothing
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*/
|
||||
sp+=6; dp = sp;
|
||||
*(dp++) = (png_byte)(255 - *(sp++));
|
||||
*dp = (png_byte)(255 - *(sp++));
|
||||
}
|
||||
}
|
||||
#endif /* WRITE_16BIT */
|
||||
}
|
||||
|
||||
else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
|
||||
{
|
||||
if (row_info->bit_depth == 8)
|
||||
{
|
||||
/* This inverts the alpha channel in GA */
|
||||
png_bytep sp, dp;
|
||||
png_uint_32 i;
|
||||
png_uint_32 row_width = row_info->width;
|
||||
|
||||
for (i = 0, sp = dp = row; i < row_width; i++)
|
||||
{
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = (png_byte)(255 - *(sp++));
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef PNG_WRITE_16BIT_SUPPORTED
|
||||
else
|
||||
{
|
||||
/* This inverts the alpha channel in GGAA */
|
||||
png_bytep sp, dp;
|
||||
png_uint_32 i;
|
||||
png_uint_32 row_width = row_info->width;
|
||||
|
||||
for (i = 0, sp = dp = row; i < row_width; i++)
|
||||
{
|
||||
/* Does nothing
|
||||
*(dp++) = *(sp++);
|
||||
*(dp++) = *(sp++);
|
||||
*/
|
||||
sp+=2; dp = sp;
|
||||
*(dp++) = (png_byte)(255 - *(sp++));
|
||||
*dp = (png_byte)(255 - *(sp++));
|
||||
}
|
||||
}
|
||||
#endif /* WRITE_16BIT */
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Transform the data according to the user's wishes. The order of
|
||||
* transformations is significant.
|
||||
*/
|
||||
void /* PRIVATE */
|
||||
png_do_write_transformations(png_structrp png_ptr, png_row_infop row_info)
|
||||
{
|
||||
png_debug(1, "in png_do_write_transformations");
|
||||
|
||||
if (png_ptr == NULL)
|
||||
return;
|
||||
|
||||
#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED
|
||||
if ((png_ptr->transformations & PNG_USER_TRANSFORM) != 0)
|
||||
if (png_ptr->write_user_transform_fn != NULL)
|
||||
(*(png_ptr->write_user_transform_fn)) /* User write transform
|
||||
function */
|
||||
(png_ptr, /* png_ptr */
|
||||
row_info, /* row_info: */
|
||||
/* png_uint_32 width; width of row */
|
||||
/* png_size_t rowbytes; number of bytes in row */
|
||||
/* png_byte color_type; color type of pixels */
|
||||
/* png_byte bit_depth; bit depth of samples */
|
||||
/* png_byte channels; number of channels (1-4) */
|
||||
/* png_byte pixel_depth; bits per pixel (depth*channels) */
|
||||
png_ptr->row_buf + 1); /* start of pixel data for row */
|
||||
#endif
|
||||
|
||||
#ifdef PNG_WRITE_FILLER_SUPPORTED
|
||||
if ((png_ptr->transformations & PNG_FILLER) != 0)
|
||||
png_do_strip_channel(row_info, png_ptr->row_buf + 1,
|
||||
!(png_ptr->flags & PNG_FLAG_FILLER_AFTER));
|
||||
#endif
|
||||
|
||||
#ifdef PNG_WRITE_PACKSWAP_SUPPORTED
|
||||
if ((png_ptr->transformations & PNG_PACKSWAP) != 0)
|
||||
png_do_packswap(row_info, png_ptr->row_buf + 1);
|
||||
#endif
|
||||
|
||||
#ifdef PNG_WRITE_PACK_SUPPORTED
|
||||
if ((png_ptr->transformations & PNG_PACK) != 0)
|
||||
png_do_pack(row_info, png_ptr->row_buf + 1,
|
||||
(png_uint_32)png_ptr->bit_depth);
|
||||
#endif
|
||||
|
||||
#ifdef PNG_WRITE_SWAP_SUPPORTED
|
||||
# ifdef PNG_16BIT_SUPPORTED
|
||||
if ((png_ptr->transformations & PNG_SWAP_BYTES) != 0)
|
||||
png_do_swap(row_info, png_ptr->row_buf + 1);
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef PNG_WRITE_SHIFT_SUPPORTED
|
||||
if ((png_ptr->transformations & PNG_SHIFT) != 0)
|
||||
png_do_shift(row_info, png_ptr->row_buf + 1,
|
||||
&(png_ptr->shift));
|
||||
#endif
|
||||
|
||||
#ifdef PNG_WRITE_SWAP_ALPHA_SUPPORTED
|
||||
if ((png_ptr->transformations & PNG_SWAP_ALPHA) != 0)
|
||||
png_do_write_swap_alpha(row_info, png_ptr->row_buf + 1);
|
||||
#endif
|
||||
|
||||
#ifdef PNG_WRITE_INVERT_ALPHA_SUPPORTED
|
||||
if ((png_ptr->transformations & PNG_INVERT_ALPHA) != 0)
|
||||
png_do_write_invert_alpha(row_info, png_ptr->row_buf + 1);
|
||||
#endif
|
||||
|
||||
#ifdef PNG_WRITE_BGR_SUPPORTED
|
||||
if ((png_ptr->transformations & PNG_BGR) != 0)
|
||||
png_do_bgr(row_info, png_ptr->row_buf + 1);
|
||||
#endif
|
||||
|
||||
#ifdef PNG_WRITE_INVERT_SUPPORTED
|
||||
if ((png_ptr->transformations & PNG_INVERT_MONO) != 0)
|
||||
png_do_invert(row_info, png_ptr->row_buf + 1);
|
||||
#endif
|
||||
}
|
||||
#endif /* WRITE_TRANSFORMS */
|
||||
#endif /* WRITE */
|
File diff suppressed because it is too large
Load Diff
@ -289,6 +289,12 @@ static void AddFontsToX11FontPath ( fDirRecord *fDirP )
|
||||
onePath = SAFE_SIZE_ARRAY_ALLOC(malloc, strlen (fDirP->name[index]) + 2, sizeof( char ) );
|
||||
if (onePath == NULL) {
|
||||
free ( ( void *) appendDirList );
|
||||
|
||||
for ( index = origIndex; index < nPaths; index++ ) {
|
||||
free( newFontPath[index] );
|
||||
}
|
||||
|
||||
free( ( void *) newFontPath);
|
||||
XFreeFontPath ( origFontPath );
|
||||
return;
|
||||
}
|
||||
@ -1137,6 +1143,7 @@ Java_sun_font_FontConfigManager_getFontConfig
|
||||
JNU_CHECK_EXCEPTION(env);
|
||||
|
||||
(*env)->SetObjectArrayElement(env, cacheDirArray, cnt++, jstr);
|
||||
(*env)->DeleteLocalRef(env, jstr);
|
||||
}
|
||||
(*FcStrListDone)(cacheDirs);
|
||||
}
|
||||
@ -1163,10 +1170,13 @@ Java_sun_font_FontConfigManager_getFontConfig
|
||||
(jstring)((*env)->GetObjectField(env, fcCompFontObj, fcNameID));
|
||||
fcName = (*env)->GetStringUTFChars(env, fcNameStr, 0);
|
||||
if (fcName == NULL) {
|
||||
(*env)->DeleteLocalRef(env, fcCompFontObj);
|
||||
(*env)->DeleteLocalRef(env, fcNameStr);
|
||||
continue;
|
||||
}
|
||||
pattern = (*FcNameParse)((FcChar8 *)fcName);
|
||||
(*env)->ReleaseStringUTFChars(env, fcNameStr, (const char*)fcName);
|
||||
(*env)->DeleteLocalRef(env, fcNameStr);
|
||||
if (pattern == NULL) {
|
||||
closeFontConfig(libfontconfig, JNI_FALSE);
|
||||
return;
|
||||
@ -1326,20 +1336,24 @@ Java_sun_font_FontConfigManager_getFontConfig
|
||||
jstr = (*env)->NewStringUTF(env, (const char*)family[j]);
|
||||
if (IS_NULL(jstr)) break;
|
||||
(*env)->SetObjectField(env, fcFont, familyNameID, jstr);
|
||||
(*env)->DeleteLocalRef(env, jstr);
|
||||
if (file[j] != NULL) {
|
||||
jstr = (*env)->NewStringUTF(env, (const char*)file[j]);
|
||||
if (IS_NULL(jstr)) break;
|
||||
(*env)->SetObjectField(env, fcFont, fontFileID, jstr);
|
||||
(*env)->DeleteLocalRef(env, jstr);
|
||||
}
|
||||
if (styleStr[j] != NULL) {
|
||||
jstr = (*env)->NewStringUTF(env, (const char*)styleStr[j]);
|
||||
if (IS_NULL(jstr)) break;
|
||||
(*env)->SetObjectField(env, fcFont, styleNameID, jstr);
|
||||
(*env)->DeleteLocalRef(env, jstr);
|
||||
}
|
||||
if (fullname[j] != NULL) {
|
||||
jstr = (*env)->NewStringUTF(env, (const char*)fullname[j]);
|
||||
if (IS_NULL(jstr)) break;
|
||||
(*env)->SetObjectField(env, fcFont, fullNameID, jstr);
|
||||
(*env)->DeleteLocalRef(env, jstr);
|
||||
}
|
||||
if (fn==0) {
|
||||
(*env)->SetObjectField(env, fcCompFontObj,
|
||||
@ -1348,10 +1362,16 @@ Java_sun_font_FontConfigManager_getFontConfig
|
||||
if (includeFallbacks) {
|
||||
(*env)->SetObjectArrayElement(env, fcFontArr, fn++,fcFont);
|
||||
} else {
|
||||
(*env)->DeleteLocalRef(env, fcFont);
|
||||
break;
|
||||
}
|
||||
(*env)->DeleteLocalRef(env, fcFont);
|
||||
}
|
||||
}
|
||||
if (includeFallbacks) {
|
||||
(*env)->DeleteLocalRef(env, fcFontArr);
|
||||
}
|
||||
(*env)->DeleteLocalRef(env, fcCompFontObj);
|
||||
(*FcFontSetDestroy)(fontset);
|
||||
(*FcPatternDestroy)(pattern);
|
||||
free(family);
|
||||
|
@ -854,6 +854,10 @@ int AwtWin32GraphicsDevice::GetScreenFromHMONITOR(HMONITOR mon) {
|
||||
"AwtWin32GraphicsDevice::GetScreenFromHMONITOR mhnd=%x", mon);
|
||||
|
||||
DASSERT(mon != NULL);
|
||||
JNIEnv *env = (JNIEnv*) JNU_GetEnv(jvm, JNI_VERSION_1_2);
|
||||
if (!Devices::GetInstance()) {
|
||||
Devices::UpdateInstance(env);
|
||||
}
|
||||
Devices::InstanceAccess devices;
|
||||
|
||||
for (int i = 0; i < devices->GetNumDevices(); i++) {
|
||||
|
@ -40,6 +40,7 @@ import javax.net.ssl.SSLParameters;
|
||||
/**
|
||||
* A container for configuration information common to multiple {@link
|
||||
* HttpRequest}s. All requests are sent through a {@code HttpClient}.
|
||||
* {@Incubating}
|
||||
*
|
||||
* <p> {@code HttpClient}s are immutable and created from a builder returned
|
||||
* from {@link HttpClient#newBuilder()}. Request builders are created by calling
|
||||
@ -76,7 +77,8 @@ public abstract class HttpClient {
|
||||
|
||||
/**
|
||||
* A builder of immutable {@link HttpClient}s. {@code HttpClient.Builder}s
|
||||
* are created by calling {@link HttpClient#newBuilder() }
|
||||
* are created by calling {@link HttpClient#newBuilder()}.
|
||||
* {@Incubating}
|
||||
*
|
||||
* <p> Each of the setter methods in this class modifies the state of the
|
||||
* builder and returns <i>this</i> (ie. the same instance). The methods are
|
||||
@ -283,6 +285,7 @@ public abstract class HttpClient {
|
||||
|
||||
/**
|
||||
* The HTTP protocol version.
|
||||
* {@Incubating}
|
||||
*
|
||||
* @since 9
|
||||
*/
|
||||
@ -300,10 +303,12 @@ public abstract class HttpClient {
|
||||
}
|
||||
|
||||
/**
|
||||
* Defines automatic redirection policy. This is checked whenever a {@code 3XX}
|
||||
* response code is received. If redirection does not happen automatically
|
||||
* then the response is returned to the user, where it can be handled
|
||||
* manually.
|
||||
* Defines automatic redirection policy.
|
||||
* {@Incubating}
|
||||
*
|
||||
* <p> This is checked whenever a {@code 3XX} response code is received. If
|
||||
* redirection does not happen automatically then the response is returned
|
||||
* to the user, where it can be handled manually.
|
||||
*
|
||||
* <p> {@code Redirect} policy is set via the {@link
|
||||
* HttpClient.Builder#followRedirects(HttpClient.Redirect)} method.
|
||||
|
@ -32,6 +32,7 @@ import java.util.OptionalLong;
|
||||
|
||||
/**
|
||||
* A read-only view of a set of HTTP headers.
|
||||
* {@Incubating}
|
||||
*
|
||||
* @since 9
|
||||
*/
|
||||
|
@ -39,10 +39,13 @@ import java.util.concurrent.Flow;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
/**
|
||||
* Represents one HTTP request which can be sent to a server. {@code
|
||||
* HttpRequest}s are built from {@code HttpRequest} {@link HttpRequest.Builder
|
||||
* builder}s. {@code HttpRequest} builders are obtained
|
||||
* by calling {@link HttpRequest#newBuilder(java.net.URI) HttpRequest.newBuilder}.
|
||||
* Represents one HTTP request which can be sent to a server.
|
||||
* {@Incubating }
|
||||
*
|
||||
* <p> {@code HttpRequest}s are built from {@code HttpRequest}
|
||||
* {@link HttpRequest.Builder builder}s. {@code HttpRequest} builders are
|
||||
* obtained by calling {@link HttpRequest#newBuilder(java.net.URI)
|
||||
* HttpRequest.newBuilder}.
|
||||
* A request's {@link java.net.URI}, headers and body can be set. Request bodies
|
||||
* are provided through a {@link BodyProcessor} object supplied to the
|
||||
* {@link Builder#DELETE(jdk.incubator.http.HttpRequest.BodyProcessor) DELETE},
|
||||
@ -250,9 +253,11 @@ public abstract class HttpRequest {
|
||||
protected HttpRequest() {}
|
||||
|
||||
/**
|
||||
* A builder of {@link HttpRequest}s. {@code HttpRequest.Builder}s are
|
||||
* created by calling {@link HttpRequest#newBuilder(URI)} or {@link
|
||||
* HttpRequest#newBuilder()}.
|
||||
* A builder of {@link HttpRequest}s.
|
||||
* {@Incubating}
|
||||
*
|
||||
* <p> {@code HttpRequest.Builder}s are created by calling {@link
|
||||
* HttpRequest#newBuilder(URI)} or {@link HttpRequest#newBuilder()}.
|
||||
*
|
||||
* <p> Each of the setter methods in this class modifies the state of the
|
||||
* builder and returns <i>this</i> (ie. the same instance). The methods are
|
||||
@ -521,8 +526,10 @@ public abstract class HttpRequest {
|
||||
/**
|
||||
* A processor which converts high level Java objects into flows of
|
||||
* {@link java.nio.ByteBuffer}s suitable for sending as request bodies.
|
||||
* {@code BodyProcessor}s implement {@link Flow.Publisher} which means they act as a
|
||||
* publisher of byte buffers.
|
||||
* {@Incubating}
|
||||
* <p>
|
||||
* {@code BodyProcessor}s implement {@link Flow.Publisher} which means they
|
||||
* act as a publisher of byte buffers.
|
||||
* <p>
|
||||
* The HTTP client implementation subscribes to the processor in
|
||||
* order to receive the flow of outgoing data buffers. The normal semantics
|
||||
|
@ -47,12 +47,15 @@ import java.util.function.Function;
|
||||
import javax.net.ssl.SSLParameters;
|
||||
|
||||
/**
|
||||
* Represents a response to a {@link HttpRequest}. A {@code HttpResponse} is
|
||||
* available when the response status code and headers have been received, and
|
||||
* typically after the response body has also been received. This depends on
|
||||
* the response body handler provided when sending the request. In all cases,
|
||||
* the response body handler is invoked before the body is read. This gives
|
||||
* applications an opportunity to decide how to handle the body.
|
||||
* Represents a response to a {@link HttpRequest}.
|
||||
* {@Incubating}
|
||||
*
|
||||
* <p>A {@code HttpResponse} is available when the response status code and
|
||||
* headers have been received, and typically after the response body has also
|
||||
* been received. This depends on the response body handler provided when
|
||||
* sending the request. In all cases, the response body handler is invoked
|
||||
* before the body is read. This gives applications an opportunity to decide
|
||||
* how to handle the body.
|
||||
*
|
||||
* <p> Methods are provided in this class for accessing the response headers,
|
||||
* and response body.
|
||||
@ -157,12 +160,15 @@ public abstract class HttpResponse<T> {
|
||||
public abstract HttpClient.Version version();
|
||||
|
||||
/**
|
||||
* A handler for response bodies. This is a function that takes two
|
||||
* parameters: the response status code, and the response headers,
|
||||
* and which returns a {@link BodyProcessor}. The function is always called
|
||||
* just before the response body is read. Its implementation may examine the
|
||||
* status code or headers and must decide, whether to accept the response
|
||||
* body or discard it, and if accepting it, exactly how to handle it.
|
||||
* A handler for response bodies.
|
||||
* {@Incubating}
|
||||
* <p>
|
||||
* This is a function that takes two parameters: the response status code,
|
||||
* and the response headers, and which returns a {@link BodyProcessor}.
|
||||
* The function is always called just before the response body is read. Its
|
||||
* implementation may examine the status code or headers and must decide,
|
||||
* whether to accept the response body or discard it, and if accepting it,
|
||||
* exactly how to handle it.
|
||||
* <p>
|
||||
* Some pre-defined implementations which do not utilize the status code
|
||||
* or headers (meaning the body is always accepted) are defined:
|
||||
@ -409,10 +415,13 @@ public abstract class HttpResponse<T> {
|
||||
}
|
||||
|
||||
/**
|
||||
* A processor for response bodies. The object acts as a
|
||||
* {@link Flow.Subscriber}<{@link ByteBuffer}> to the HTTP client implementation
|
||||
* which publishes ByteBuffers containing the response body. The processor
|
||||
* converts the incoming buffers of data to some user-defined object type {@code T}.
|
||||
* A processor for response bodies.
|
||||
* {@Incubating}
|
||||
* <p>
|
||||
* The object acts as a {@link Flow.Subscriber}<{@link ByteBuffer}> to
|
||||
* the HTTP client implementation which publishes ByteBuffers containing the
|
||||
* response body. The processor converts the incoming buffers of data to
|
||||
* some user-defined object type {@code T}.
|
||||
* <p>
|
||||
* The {@link #getBody()} method returns a {@link CompletionStage}{@code <T>}
|
||||
* that provides the response body object. The {@code CompletionStage} must
|
||||
@ -539,12 +548,14 @@ public abstract class HttpResponse<T> {
|
||||
}
|
||||
|
||||
/**
|
||||
* A response processor for a HTTP/2 multi response. A multi response
|
||||
* comprises a main response, and zero or more additional responses. Each
|
||||
* additional response is sent by the server in response to requests that
|
||||
* the server also generates. Additional responses are typically resources
|
||||
* that the server expects the client will need which are related to the
|
||||
* initial request.
|
||||
* A response processor for a HTTP/2 multi response.
|
||||
* {@Incubating}
|
||||
* <p>
|
||||
* A multi response comprises a main response, and zero or more additional
|
||||
* responses. Each additional response is sent by the server in response to
|
||||
* requests that the server also generates. Additional responses are
|
||||
* typically resources that the server expects the client will need which
|
||||
* are related to the initial request.
|
||||
* <p>
|
||||
* Note. Instead of implementing this interface, applications should consider
|
||||
* first using the mechanism (built on this interface) provided by
|
||||
|
@ -29,6 +29,7 @@ import java.io.IOException;
|
||||
|
||||
/**
|
||||
* Thrown when a response is not received within a specified time period.
|
||||
* {@Incubating}
|
||||
*/
|
||||
public class HttpTimeoutException extends IOException {
|
||||
|
||||
|
@ -32,6 +32,8 @@ import java.util.concurrent.CompletableFuture;
|
||||
|
||||
/**
|
||||
* A {@link java.util.Map} containing the result of a HTTP/2 request and multi-response.
|
||||
* {@Incubating}
|
||||
* <p>
|
||||
* This is one possible implementation of the aggregate result type {@code <U>} returned
|
||||
* from {@link HttpClient#sendAsync(HttpRequest,MultiProcessor) }.
|
||||
* The map is indexed by {@link HttpRequest} and each value is a
|
||||
|
@ -35,6 +35,7 @@ import java.util.concurrent.CompletionStage;
|
||||
|
||||
/**
|
||||
* A WebSocket client conforming to RFC 6455.
|
||||
* {@Incubating}
|
||||
*
|
||||
* <p> A {@code WebSocket} provides full-duplex communication over a TCP
|
||||
* connection.
|
||||
@ -105,6 +106,7 @@ public interface WebSocket {
|
||||
|
||||
/**
|
||||
* A builder for creating {@code WebSocket} instances.
|
||||
* {@Incubating}
|
||||
*
|
||||
* <p> To build a {@code WebSocket}, {@linkplain HttpClient#newWebSocketBuilder(
|
||||
* URI, Listener) create} a builder, configure it as required by
|
||||
@ -219,6 +221,7 @@ public interface WebSocket {
|
||||
|
||||
/**
|
||||
* A listener for events and messages on a {@code WebSocket}.
|
||||
* {@Incubating}
|
||||
*
|
||||
* <p> Each method of {@code Listener} corresponds to a type of event or a
|
||||
* type of message. The {@code WebSocket} argument of the method is the
|
||||
@ -570,6 +573,7 @@ public interface WebSocket {
|
||||
/**
|
||||
* A marker used by {@link WebSocket.Listener} in cases where a partial
|
||||
* message may be received.
|
||||
* {@Incubating}
|
||||
*
|
||||
* @see Listener#onText(WebSocket, CharSequence, MessagePart)
|
||||
* @see Listener#onBinary(WebSocket, ByteBuffer, MessagePart)
|
||||
|
1
jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/WebSocketHandshakeException.java
1
jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/WebSocketHandshakeException.java
@ -29,6 +29,7 @@ import java.io.IOException;
|
||||
|
||||
/**
|
||||
* An exception used to signal the opening handshake failed.
|
||||
* {@Incubating}
|
||||
*
|
||||
* @since 9
|
||||
*/
|
||||
|
@ -25,8 +25,9 @@
|
||||
|
||||
/**
|
||||
* <h2>High level HTTP and WebSocket API</h2>
|
||||
* {@Incubating}
|
||||
*
|
||||
* This provides a high-level client interfaces to HTTP (versions 1.1 and 2) and
|
||||
* <p> Provides high-level client interfaces to HTTP (versions 1.1 and 2) and
|
||||
* WebSocket. The main types defined are:
|
||||
*
|
||||
* <ul>
|
||||
|
@ -25,6 +25,7 @@
|
||||
|
||||
/**
|
||||
* Defines the high-level HTTP and WebSocket API.
|
||||
* {@Incubating}
|
||||
*/
|
||||
module jdk.incubator.httpclient {
|
||||
requires java.base;
|
||||
|
@ -203,6 +203,8 @@ java/rmi/activation/ActivationGroup/downloadActivationGroup/DownloadActivationGr
|
||||
|
||||
sun/rmi/rmic/newrmic/equivalence/run.sh 8145980 generic-all
|
||||
|
||||
java/rmi/registry/readTest/CodebaseTest.java 8173324 windows-all
|
||||
|
||||
############################################################################
|
||||
|
||||
# jdk_security
|
||||
@ -262,6 +264,8 @@ tools/jlink/multireleasejar/JLinkMultiReleaseJarTest.java 8169971 windows-
|
||||
|
||||
tools/jlink/CustomPluginTest.java 8172864 generic-all
|
||||
|
||||
tools/jar/multiRelease/ApiValidatorTest.java 8173396 generic-all
|
||||
|
||||
############################################################################
|
||||
|
||||
# jdk_jdi
|
||||
|
@ -21,43 +21,54 @@
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/*
|
||||
/*
|
||||
@test
|
||||
@bug 8154043
|
||||
@bug 8154043 8172509
|
||||
@summary Fields not reachable anymore by tab-key, because of new tabbing
|
||||
behaviour of radio button groups.
|
||||
@run main ButtonGroupLayoutTraversalTest
|
||||
*/
|
||||
|
||||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
*/
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.Color;
|
||||
import java.awt.GridLayout;
|
||||
import java.awt.Robot;
|
||||
import java.awt.event.FocusAdapter;
|
||||
import java.awt.event.FocusEvent;
|
||||
import java.awt.event.KeyEvent;
|
||||
import javax.swing.JFrame;
|
||||
import javax.swing.SwingUtilities;
|
||||
import javax.swing.UIManager;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.ButtonGroup;
|
||||
import javax.swing.JComponent;
|
||||
import javax.swing.JRadioButton;
|
||||
import javax.swing.JToggleButton;
|
||||
import javax.swing.LayoutFocusTraversalPolicy;
|
||||
import javax.swing.UnsupportedLookAndFeelException;
|
||||
|
||||
public class ButtonGroupLayoutTraversalTest {
|
||||
|
||||
static int nx = 3;
|
||||
static int ny = 3;
|
||||
|
||||
static int focusCnt[] = new int[nx * ny];
|
||||
private static JFrame window;
|
||||
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
|
||||
SwingUtilities.invokeAndWait(()->initLayout(nx, ny));
|
||||
SwingUtilities.invokeAndWait(() -> changeLAF());
|
||||
SwingUtilities.invokeAndWait(() -> initLayout(nx, ny));
|
||||
Robot robot = new Robot();
|
||||
robot.setAutoDelay(100);
|
||||
robot.waitForIdle();
|
||||
robot.delay(200);
|
||||
|
||||
|
||||
for(int i = 0; i < nx * ny - nx * ny / 2 - 1; i++) {
|
||||
for (int i = 0; i < nx * ny - nx * ny / 2 - 1; i++) {
|
||||
robot.keyPress(KeyEvent.VK_RIGHT);
|
||||
robot.keyRelease(KeyEvent.VK_RIGHT);
|
||||
}
|
||||
|
||||
for(int i = 0; i < nx * ny / 2; i++) {
|
||||
for (int i = 0; i < nx * ny / 2; i++) {
|
||||
robot.keyPress(KeyEvent.VK_TAB);
|
||||
robot.keyRelease(KeyEvent.VK_TAB);
|
||||
}
|
||||
@ -65,26 +76,26 @@ public class ButtonGroupLayoutTraversalTest {
|
||||
robot.waitForIdle();
|
||||
robot.delay(200);
|
||||
|
||||
for(int i = 0; i < nx * ny; i++) {
|
||||
if(focusCnt[i] < 1) {
|
||||
for (int i = 0; i < nx * ny; i++) {
|
||||
if (focusCnt[i] < 1) {
|
||||
SwingUtilities.invokeLater(window::dispose);
|
||||
throw new RuntimeException("Component " + i +
|
||||
" is not reachable in the forward focus cycle");
|
||||
throw new RuntimeException("Component " + i
|
||||
+ " is not reachable in the forward focus cycle");
|
||||
} else if (focusCnt[i] > 1) {
|
||||
SwingUtilities.invokeLater(window::dispose);
|
||||
throw new RuntimeException("Component " + i +
|
||||
" got focus more than once in the forward focus cycle");
|
||||
throw new RuntimeException("Component " + i
|
||||
+ " got focus more than once in the forward focus cycle");
|
||||
}
|
||||
}
|
||||
|
||||
for(int i = 0; i < nx * ny / 2; i++) {
|
||||
for (int i = 0; i < nx * ny / 2; i++) {
|
||||
robot.keyPress(KeyEvent.VK_SHIFT);
|
||||
robot.keyPress(KeyEvent.VK_TAB);
|
||||
robot.keyRelease(KeyEvent.VK_TAB);
|
||||
robot.keyRelease(KeyEvent.VK_SHIFT);
|
||||
}
|
||||
|
||||
for(int i = 0; i < nx * ny - nx * ny / 2 - 1; i++) {
|
||||
for (int i = 0; i < nx * ny - nx * ny / 2 - 1; i++) {
|
||||
robot.keyPress(KeyEvent.VK_LEFT);
|
||||
robot.keyRelease(KeyEvent.VK_LEFT);
|
||||
}
|
||||
@ -97,23 +108,37 @@ public class ButtonGroupLayoutTraversalTest {
|
||||
robot.waitForIdle();
|
||||
robot.delay(200);
|
||||
|
||||
for(int i = 0; i < nx * ny; i++) {
|
||||
if(focusCnt[i] < 2) {
|
||||
for (int i = 0; i < nx * ny; i++) {
|
||||
if (focusCnt[i] < 2) {
|
||||
SwingUtilities.invokeLater(window::dispose);
|
||||
throw new RuntimeException("Component " + i +
|
||||
" is not reachable in the backward focus cycle");
|
||||
throw new RuntimeException("Component " + i
|
||||
+ " is not reachable in the backward focus cycle");
|
||||
} else if (focusCnt[i] > 2) {
|
||||
SwingUtilities.invokeLater(window::dispose);
|
||||
throw new RuntimeException("Component " + i +
|
||||
" got focus more than once in the backward focus cycle");
|
||||
throw new RuntimeException("Component " + i
|
||||
+ " got focus more than once in the backward focus cycle");
|
||||
}
|
||||
}
|
||||
|
||||
SwingUtilities.invokeLater(window::dispose);
|
||||
}
|
||||
|
||||
public static void initLayout(int nx, int ny)
|
||||
{
|
||||
private static void changeLAF() {
|
||||
String currentLAF = UIManager.getLookAndFeel().toString();
|
||||
currentLAF = currentLAF.toLowerCase();
|
||||
if (currentLAF.contains("aqua") || currentLAF.contains("nimbus")) {
|
||||
try {
|
||||
UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
|
||||
} catch (ClassNotFoundException
|
||||
| IllegalAccessException
|
||||
| InstantiationException
|
||||
| UnsupportedLookAndFeelException ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void initLayout(int nx, int ny) {
|
||||
window = new JFrame("Test");
|
||||
window.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
|
||||
JPanel rootPanel = new JPanel();
|
||||
@ -122,9 +147,9 @@ public class ButtonGroupLayoutTraversalTest {
|
||||
formPanel.setFocusTraversalPolicy(new LayoutFocusTraversalPolicy());
|
||||
formPanel.setFocusCycleRoot(true);
|
||||
ButtonGroup radioButtonGroup = new ButtonGroup();
|
||||
for(int i = 0; i < nx * ny; i++) {
|
||||
for (int i = 0; i < nx * ny; i++) {
|
||||
JToggleButton comp;
|
||||
if(i % 2 == 0) {
|
||||
if (i % 2 == 0) {
|
||||
comp = new JRadioButton("Grouped component");
|
||||
radioButtonGroup.add(comp);
|
||||
} else {
|
||||
@ -137,10 +162,10 @@ public class ButtonGroupLayoutTraversalTest {
|
||||
@Override
|
||||
public void focusGained(FocusEvent e) {
|
||||
focusCnt[fi]++;
|
||||
if( focusCnt[fi] == 1) {
|
||||
if (focusCnt[fi] == 1) {
|
||||
((JComponent) e.getSource())
|
||||
.setBackground(Color.yellow);
|
||||
} else if(focusCnt[fi] == 2) {
|
||||
} else if (focusCnt[fi] == 2) {
|
||||
((JComponent) e.getSource())
|
||||
.setBackground(Color.green);
|
||||
} else {
|
||||
|
66
jdk/test/java/awt/FontClass/AppleFontNameTest.java
Normal file
66
jdk/test/java/awt/FontClass/AppleFontNameTest.java
Normal file
@ -0,0 +1,66 @@
|
||||
/*
|
||||
* Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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 6232267
|
||||
* @requires (os.family == "mac")
|
||||
* @summary Test reading a font with only Apple names.
|
||||
* @run main AppleFontNameTest
|
||||
*/
|
||||
|
||||
import java.awt.Font;
|
||||
import java.io.File;
|
||||
|
||||
/*
|
||||
* This test picks on a font that is known to have only Apple names.
|
||||
* So it runs only on MacOS and works only if the font is where it
|
||||
* has historically been. Anything else is a silent pass.`
|
||||
*/
|
||||
|
||||
public class AppleFontNameTest {
|
||||
|
||||
static String file = "/System/Library/Fonts/Menlo.ttc";
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
String os = System.getProperty("os.name");
|
||||
if (!(os.startsWith("Mac"))) {
|
||||
return;
|
||||
}
|
||||
File fontFile = new File(file);
|
||||
if (!fontFile.exists()) {
|
||||
return;
|
||||
}
|
||||
Font[] fonts = Font.createFonts(new File(file));
|
||||
System.out.println("createFont from file returned " + fonts);
|
||||
|
||||
if (fonts == null || fonts.length == 0) {
|
||||
throw new RuntimeException("No fonts");
|
||||
}
|
||||
for (Font f : fonts) {
|
||||
System.out.println(f);
|
||||
if (!f.getFamily().equals("Menlo"))
|
||||
throw new RuntimeException("Expected Menlo, got " + f.getFamily());
|
||||
}
|
||||
}
|
||||
}
|
42
jdk/test/java/awt/FontMetrics/FontCrash.java
Normal file
42
jdk/test/java/awt/FontMetrics/FontCrash.java
Normal file
@ -0,0 +1,42 @@
|
||||
/*
|
||||
* Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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 8172999
|
||||
* @summary Verify no crash loading font metrics instance.
|
||||
* @run main/othervm FontCrash
|
||||
*/
|
||||
import java.awt.Font;
|
||||
import java.awt.FontMetrics;
|
||||
import java.awt.Toolkit;
|
||||
|
||||
public class FontCrash {
|
||||
|
||||
public static void main(String[] args) {
|
||||
System.setProperty("java2d.font.usePlatformFont", "true");
|
||||
Font f = new Font(Font.DIALOG,Font.PLAIN,12);
|
||||
Toolkit tk = Toolkit.getDefaultToolkit();
|
||||
tk.getFontMetrics(f);
|
||||
}
|
||||
}
|
@ -23,7 +23,7 @@
|
||||
#
|
||||
#
|
||||
# @test
|
||||
# @bug 6430247 8130507 8020448
|
||||
# @bug 6430247 8130507 8020448 8172813
|
||||
# @summary Tests that there are no JNI warnings.
|
||||
# @compile JNICheck.java
|
||||
# @run shell/timeout=300 JNICheck.sh
|
||||
@ -49,7 +49,7 @@ else
|
||||
fi
|
||||
|
||||
$JAVA_HOME/bin/java ${TESTVMOPTS} \
|
||||
-cp "${CP}" -Xcheck:jni JNICheck > "${CP}"/log.txt
|
||||
-cp "${CP}" -Xcheck:jni JNICheck | grep -v SIG | grep -v Signal | grep -v CallStatic > "${CP}"/log.txt
|
||||
|
||||
# any messages logged may indicate a failure.
|
||||
if [ -s "${CP}"/log.txt ]; then
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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,9 +27,15 @@
|
||||
* Create class file using ASM, slightly modified the ASMifier output
|
||||
*/
|
||||
|
||||
import sun.reflect.annotation.AnnotationType;
|
||||
import org.testng.Assert;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
import java.lang.annotation.Annotation;
|
||||
import java.lang.annotation.AnnotationFormatError;
|
||||
import org.testng.annotations.*;
|
||||
import java.util.Arrays;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
/*
|
||||
* @test
|
||||
@ -37,27 +43,380 @@ import org.testng.annotations.*;
|
||||
* @summary Verify valid annotation
|
||||
* @modules java.base/jdk.internal.org.objectweb.asm
|
||||
* @modules java.base/sun.reflect.annotation
|
||||
* @clean AnnotationWithVoidReturn.class AnnotationWithParameter.class
|
||||
* @compile -XDignore.symbol.file ClassFileGenerator.java
|
||||
* @clean AnnotationWithVoidReturn AnnotationWithParameter
|
||||
* AnnotationWithExtraInterface AnnotationWithException
|
||||
* AnnotationWithHashCode AnnotationWithDefaultMember
|
||||
* AnnotationWithoutAnnotationAccessModifier HolderX
|
||||
* @compile -XDignore.symbol.file ClassFileGenerator.java GoodAnnotation.java
|
||||
* @run main ClassFileGenerator
|
||||
* @run testng AnnotationVerifier
|
||||
*/
|
||||
|
||||
public class AnnotationVerifier {
|
||||
|
||||
@AnnotationWithParameter
|
||||
@AnnotationWithVoidReturn
|
||||
static class BadAnnotation {
|
||||
//=======================================================
|
||||
// GoodAnnotation...
|
||||
|
||||
@GoodAnnotation
|
||||
static class HolderA {
|
||||
}
|
||||
|
||||
@Test
|
||||
@ExpectedExceptions(IllegalArgumentException.class)
|
||||
public void annotationValidationIAE() {
|
||||
AnnotationType.getInstance(AnnotationWithParameter.class);
|
||||
public void holderA_goodAnnotation() {
|
||||
testGetAnnotation(HolderA.class, GoodAnnotation.class, true);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void holderA_annotations() {
|
||||
testGetAnnotations(HolderA.class, GoodAnnotation.class);
|
||||
}
|
||||
|
||||
//=======================================================
|
||||
// AnnotationWithParameter...
|
||||
|
||||
/*
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
public @interface AnnotationWithParameter {
|
||||
int m(int x) default -1;
|
||||
}
|
||||
*/
|
||||
|
||||
@GoodAnnotation
|
||||
@AnnotationWithParameter
|
||||
static class HolderB {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void holderB_annotationWithParameter() {
|
||||
testGetAnnotation(HolderB.class, AnnotationWithParameter.class, false);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void holderB_goodAnnotation() {
|
||||
testGetAnnotation(HolderB.class, GoodAnnotation.class, true);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void holderB_annotations() {
|
||||
testGetAnnotations(HolderB.class, GoodAnnotation.class);
|
||||
}
|
||||
|
||||
//=======================================================
|
||||
// AnnotationWithVoidReturn...
|
||||
|
||||
/*
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
public @interface AnnotationWithVoidReturn {
|
||||
void m() default 1;
|
||||
}
|
||||
*/
|
||||
|
||||
@GoodAnnotation
|
||||
@AnnotationWithVoidReturn
|
||||
static class HolderC {
|
||||
}
|
||||
|
||||
@Test(expectedExceptions = AnnotationFormatError.class)
|
||||
public void annotationValidationAFE() {
|
||||
BadAnnotation.class.getAnnotation(AnnotationWithVoidReturn.class);
|
||||
public void holderC_annotationWithVoidReturn() {
|
||||
testGetAnnotation(HolderC.class, AnnotationWithVoidReturn.class, false);
|
||||
}
|
||||
|
||||
@Test(expectedExceptions = AnnotationFormatError.class)
|
||||
public void holderC_goodAnnotation() {
|
||||
testGetAnnotation(HolderC.class, GoodAnnotation.class, false);
|
||||
}
|
||||
|
||||
@Test(expectedExceptions = AnnotationFormatError.class)
|
||||
public void holderC_annotations() {
|
||||
testGetAnnotations(HolderC.class);
|
||||
}
|
||||
|
||||
//=======================================================
|
||||
// AnnotationWithExtraInterface...
|
||||
|
||||
/*
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
public @interface AnnotationWithExtraInterface extends java.io.Serializable {
|
||||
int m() default 1;
|
||||
}
|
||||
*/
|
||||
|
||||
@GoodAnnotation
|
||||
@AnnotationWithExtraInterface
|
||||
static class HolderD {
|
||||
}
|
||||
|
||||
@Test(expectedExceptions = AnnotationFormatError.class)
|
||||
public void holderD_annotationWithExtraInterface() {
|
||||
testGetAnnotation(HolderD.class, AnnotationWithExtraInterface.class, false);
|
||||
}
|
||||
|
||||
@Test(expectedExceptions = AnnotationFormatError.class)
|
||||
public void holderD_goodAnnotation() {
|
||||
testGetAnnotation(HolderD.class, GoodAnnotation.class, false);
|
||||
}
|
||||
|
||||
@Test(expectedExceptions = AnnotationFormatError.class)
|
||||
public void holderD_annotations() {
|
||||
testGetAnnotations(HolderD.class);
|
||||
}
|
||||
|
||||
//=======================================================
|
||||
// AnnotationWithException...
|
||||
|
||||
/*
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
public @interface AnnotationWithException {
|
||||
int m() throws Exception default 1;
|
||||
}
|
||||
*/
|
||||
|
||||
@GoodAnnotation
|
||||
@AnnotationWithException
|
||||
static class HolderE {
|
||||
}
|
||||
|
||||
@AnnotationWithException
|
||||
static class HolderE2 {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void holderE_annotationWithException() {
|
||||
testGetAnnotation(HolderE.class, AnnotationWithException.class, true);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void holderE_goodAnnotation() {
|
||||
testGetAnnotation(HolderE.class, GoodAnnotation.class, true);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void holderE_annotations() {
|
||||
testGetAnnotations(HolderE.class, GoodAnnotation.class, AnnotationWithException.class);
|
||||
}
|
||||
|
||||
@Test(expectedExceptions = AnnotationFormatError.class)
|
||||
public void holderE_annotationWithException_equals() {
|
||||
AnnotationWithException ann1, ann2;
|
||||
try {
|
||||
ann1 = HolderE.class.getAnnotation(AnnotationWithException.class);
|
||||
ann2 = HolderE2.class.getAnnotation(AnnotationWithException.class);
|
||||
} catch (Throwable t) {
|
||||
throw new AssertionError("Unexpected exception", t);
|
||||
}
|
||||
Assert.assertNotNull(ann1);
|
||||
Assert.assertNotNull(ann2);
|
||||
|
||||
testEquals(ann1, ann2, true); // this throws AnnotationFormatError
|
||||
}
|
||||
|
||||
//=======================================================
|
||||
// AnnotationWithHashCode...
|
||||
|
||||
/*
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
public @interface AnnotationWithHashCode {
|
||||
int hashCode() default 1;
|
||||
}
|
||||
*/
|
||||
|
||||
@GoodAnnotation
|
||||
@AnnotationWithHashCode
|
||||
static class HolderF {
|
||||
}
|
||||
|
||||
@AnnotationWithHashCode
|
||||
static class HolderF2 {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void holderF_annotationWithHashCode() {
|
||||
testGetAnnotation(HolderF.class, AnnotationWithHashCode.class, true);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void holderF_goodAnnotation() {
|
||||
testGetAnnotation(HolderF.class, GoodAnnotation.class, true);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void holderF_annotations() {
|
||||
testGetAnnotations(HolderF.class, GoodAnnotation.class, AnnotationWithHashCode.class);
|
||||
}
|
||||
|
||||
@Test(expectedExceptions = AnnotationFormatError.class)
|
||||
public void holderF_annotationWithHashCode_equals() {
|
||||
AnnotationWithHashCode ann1, ann2;
|
||||
try {
|
||||
ann1 = HolderF.class.getAnnotation(AnnotationWithHashCode.class);
|
||||
ann2 = HolderF2.class.getAnnotation(AnnotationWithHashCode.class);
|
||||
} catch (Throwable t) {
|
||||
throw new AssertionError("Unexpected exception", t);
|
||||
}
|
||||
Assert.assertNotNull(ann1);
|
||||
Assert.assertNotNull(ann2);
|
||||
|
||||
testEquals(ann1, ann2, true); // this throws AnnotationFormatError
|
||||
}
|
||||
|
||||
//=======================================================
|
||||
// AnnotationWithDefaultMember...
|
||||
|
||||
/*
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
public @interface AnnotationWithDefaultMember {
|
||||
int m() default 1;
|
||||
default int d() default 2 { return 2; }
|
||||
}
|
||||
*/
|
||||
|
||||
@GoodAnnotation
|
||||
@AnnotationWithDefaultMember
|
||||
static class HolderG {
|
||||
}
|
||||
|
||||
@AnnotationWithDefaultMember
|
||||
static class HolderG2 {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void holderG_annotationWithDefaultMember() {
|
||||
testGetAnnotation(HolderG.class, AnnotationWithDefaultMember.class, true);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void holderG_goodAnnotation() {
|
||||
testGetAnnotation(HolderG.class, GoodAnnotation.class, true);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void holderG_annotations() {
|
||||
testGetAnnotations(HolderG.class, GoodAnnotation.class, AnnotationWithDefaultMember.class);
|
||||
}
|
||||
|
||||
@Test(expectedExceptions = AnnotationFormatError.class)
|
||||
public void holderG_annotationWithDefaultMember_equals() {
|
||||
AnnotationWithDefaultMember ann1, ann2;
|
||||
try {
|
||||
ann1 = HolderG.class.getAnnotation(AnnotationWithDefaultMember.class);
|
||||
ann2 = HolderG2.class.getAnnotation(AnnotationWithDefaultMember.class);
|
||||
} catch (Throwable t) {
|
||||
throw new AssertionError("Unexpected exception", t);
|
||||
}
|
||||
Assert.assertNotNull(ann1);
|
||||
Assert.assertNotNull(ann2);
|
||||
|
||||
testEquals(ann1, ann2, true); // this throws AnnotationFormatError
|
||||
}
|
||||
|
||||
//=======================================================
|
||||
// AnnotationWithoutAnnotationAccessModifier...
|
||||
|
||||
/*
|
||||
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
public interface AnnotationWithoutAnnotationAccessModifier extends Annotation {
|
||||
int m() default 1;
|
||||
}
|
||||
|
||||
@GoodAnnotation
|
||||
@AnnotationWithoutAnnotationAccessModifier
|
||||
static class HolderX {
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
@Test
|
||||
public void holderX_annotationWithoutAnnotationAccessModifier() {
|
||||
testGetAnnotation(HolderX.class, AnnotationWithoutAnnotationAccessModifier.class, false);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void holderX_goodAnnotation() {
|
||||
testGetAnnotation(HolderX.class, GoodAnnotation.class, true);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void holderX_annotations() {
|
||||
testGetAnnotations(HolderX.class, GoodAnnotation.class);
|
||||
}
|
||||
|
||||
//=======================================================
|
||||
// utils
|
||||
//
|
||||
|
||||
private static void testGetAnnotation(Class<?> holderClass,
|
||||
Class<? extends Annotation> annType,
|
||||
boolean expectedPresent) {
|
||||
Object result = null;
|
||||
try {
|
||||
try {
|
||||
result = holderClass.getAnnotation(annType);
|
||||
if (expectedPresent != (result != null)) {
|
||||
throw new AssertionError("Expected " +
|
||||
(expectedPresent ? "non-null" : "null") +
|
||||
" result, but got: " + result);
|
||||
}
|
||||
} catch (Throwable t) {
|
||||
result = t;
|
||||
throw t;
|
||||
}
|
||||
} finally {
|
||||
System.out.println("\n" +
|
||||
holderClass.getSimpleName() +
|
||||
".class.getAnnotation(" +
|
||||
annType.getSimpleName() +
|
||||
".class) = " +
|
||||
result);
|
||||
}
|
||||
}
|
||||
|
||||
private static void testGetAnnotations(Class<?> holderClass,
|
||||
Class<? extends Annotation> ... expectedTypes) {
|
||||
Object result = null;
|
||||
try {
|
||||
try {
|
||||
Annotation[] anns = holderClass.getAnnotations();
|
||||
|
||||
Set<Class<? extends Annotation>> gotTypes =
|
||||
Stream.of(anns)
|
||||
.map(Annotation::annotationType)
|
||||
.collect(Collectors.toSet());
|
||||
|
||||
Set<Class<? extends Annotation>> expTypes =
|
||||
Stream.of(expectedTypes)
|
||||
.collect(Collectors.toSet());
|
||||
|
||||
if (!expTypes.equals(gotTypes)) {
|
||||
throw new AssertionError("Expected annotation types: " + expTypes +
|
||||
" but got: " + Arrays.toString(anns));
|
||||
}
|
||||
result = Arrays.toString(anns);
|
||||
} catch (Throwable t) {
|
||||
result = t;
|
||||
throw t;
|
||||
}
|
||||
} finally {
|
||||
System.out.println("\n" +
|
||||
holderClass.getSimpleName() +
|
||||
".class.getAnnotations() = " +
|
||||
result);
|
||||
}
|
||||
}
|
||||
|
||||
private static void testEquals(Annotation ann1, Annotation ann2, boolean expectedEquals) {
|
||||
Object result = null;
|
||||
try {
|
||||
try {
|
||||
boolean gotEquals = ann1.equals(ann2);
|
||||
Assert.assertEquals(gotEquals, expectedEquals);
|
||||
result = gotEquals;
|
||||
} catch (Throwable t) {
|
||||
result = t;
|
||||
throw t;
|
||||
}
|
||||
} finally {
|
||||
System.out.println("\n" + ann1 + ".equals(" + ann2 + ") = " + result);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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,13 @@ public class ClassFileGenerator {
|
||||
public static void main(String... args) throws Exception {
|
||||
classFileWriter("AnnotationWithVoidReturn.class", AnnoationWithVoidReturnDump.dump());
|
||||
classFileWriter("AnnotationWithParameter.class", AnnoationWithParameterDump.dump());
|
||||
classFileWriter("AnnotationWithExtraInterface.class", AnnotationWithExtraInterfaceDump.dump());
|
||||
classFileWriter("AnnotationWithException.class", AnnotationWithExceptionDump.dump());
|
||||
classFileWriter("AnnotationWithHashCode.class", AnnotationWithHashCodeDump.dump());
|
||||
classFileWriter("AnnotationWithDefaultMember.class", AnnotationWithDefaultMemberDump.dump());
|
||||
classFileWriter("AnnotationWithoutAnnotationAccessModifier.class",
|
||||
AnnotationWithoutAnnotationAccessModifierDump.dump());
|
||||
classFileWriter("HolderX.class", HolderXDump.dump());
|
||||
}
|
||||
|
||||
private static void classFileWriter(String name, byte[] contents) throws IOException {
|
||||
@ -49,14 +56,13 @@ public class ClassFileGenerator {
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
Following code create equivalent classfile,
|
||||
which is not allowed by javac.
|
||||
/* Following code creates equivalent classfile, which is not allowed by javac:
|
||||
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
public @interface AnnotationWithVoidReturn {
|
||||
void m() default 1;
|
||||
void m() default 1;
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
private static class AnnoationWithVoidReturnDump implements Opcodes {
|
||||
@ -65,7 +71,7 @@ public class ClassFileGenerator {
|
||||
MethodVisitor mv;
|
||||
AnnotationVisitor av0;
|
||||
|
||||
cw.visit(52, ACC_PUBLIC + ACC_ANNOTATION + ACC_ABSTRACT + +ACC_INTERFACE,
|
||||
cw.visit(52, ACC_PUBLIC + ACC_ANNOTATION + ACC_ABSTRACT + ACC_INTERFACE,
|
||||
"AnnotationWithVoidReturn", null,
|
||||
"java/lang/Object", new String[]{"java/lang/annotation/Annotation"});
|
||||
|
||||
@ -91,14 +97,13 @@ public class ClassFileGenerator {
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
Following code create equivalent classfile,
|
||||
which is not allowed by javac.
|
||||
/* Following code creates equivalent classfile, which is not allowed by javac:
|
||||
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
public @interface AnnotationWithParameter {
|
||||
int m(int x);
|
||||
int m(int x) default -1;
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
private static class AnnoationWithParameterDump implements Opcodes {
|
||||
@ -136,4 +141,250 @@ public class ClassFileGenerator {
|
||||
}
|
||||
}
|
||||
|
||||
/* Following code creates equivalent classfile, which is not allowed by javac:
|
||||
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
public @interface AnnotationWithExtraInterface extends java.io.Serializable {
|
||||
int m() default 1;
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
private static class AnnotationWithExtraInterfaceDump implements Opcodes {
|
||||
public static byte[] dump() throws Exception {
|
||||
ClassWriter cw = new ClassWriter(0);
|
||||
MethodVisitor mv;
|
||||
AnnotationVisitor av0;
|
||||
|
||||
cw.visit(52, ACC_PUBLIC + ACC_ANNOTATION + ACC_ABSTRACT + ACC_INTERFACE,
|
||||
"AnnotationWithExtraInterface", null,
|
||||
"java/lang/Object", new String[]{"java/lang/annotation/Annotation",
|
||||
"java/io/Serializable"});
|
||||
|
||||
{
|
||||
av0 = cw.visitAnnotation("Ljava/lang/annotation/Retention;", true);
|
||||
av0.visitEnum("value", "Ljava/lang/annotation/RetentionPolicy;",
|
||||
"RUNTIME");
|
||||
av0.visitEnd();
|
||||
}
|
||||
{
|
||||
mv = cw.visitMethod(ACC_PUBLIC + ACC_ABSTRACT, "m", "()I", null, null);
|
||||
mv.visitEnd();
|
||||
}
|
||||
{
|
||||
av0 = mv.visitAnnotationDefault();
|
||||
av0.visit(null, new Integer(1));
|
||||
av0.visitEnd();
|
||||
}
|
||||
cw.visitEnd();
|
||||
|
||||
return cw.toByteArray();
|
||||
}
|
||||
}
|
||||
|
||||
/* Following code creates equivalent classfile, which is not allowed by javac:
|
||||
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
public @interface AnnotationWithException {
|
||||
int m() throws Exception default 1;
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
private static class AnnotationWithExceptionDump implements Opcodes {
|
||||
public static byte[] dump() throws Exception {
|
||||
ClassWriter cw = new ClassWriter(0);
|
||||
MethodVisitor mv;
|
||||
AnnotationVisitor av0;
|
||||
|
||||
cw.visit(52, ACC_PUBLIC + ACC_ANNOTATION + ACC_ABSTRACT + ACC_INTERFACE,
|
||||
"AnnotationWithException", null,
|
||||
"java/lang/Object", new String[]{"java/lang/annotation/Annotation"});
|
||||
|
||||
{
|
||||
av0 = cw.visitAnnotation("Ljava/lang/annotation/Retention;", true);
|
||||
av0.visitEnum("value", "Ljava/lang/annotation/RetentionPolicy;",
|
||||
"RUNTIME");
|
||||
av0.visitEnd();
|
||||
}
|
||||
{
|
||||
mv = cw.visitMethod(ACC_PUBLIC + ACC_ABSTRACT, "m", "()I", null,
|
||||
new String[] {"java/lang/Exception"});
|
||||
mv.visitEnd();
|
||||
}
|
||||
{
|
||||
av0 = mv.visitAnnotationDefault();
|
||||
av0.visit(null, new Integer(1));
|
||||
av0.visitEnd();
|
||||
}
|
||||
cw.visitEnd();
|
||||
|
||||
return cw.toByteArray();
|
||||
}
|
||||
}
|
||||
|
||||
/* Following code creates equivalent classfile, which is not allowed by javac:
|
||||
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
public @interface AnnotationWithHashCode {
|
||||
int hashCode() default 1;
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
private static class AnnotationWithHashCodeDump implements Opcodes {
|
||||
public static byte[] dump() throws Exception {
|
||||
ClassWriter cw = new ClassWriter(0);
|
||||
MethodVisitor mv;
|
||||
AnnotationVisitor av0;
|
||||
|
||||
cw.visit(52, ACC_PUBLIC + ACC_ANNOTATION + ACC_ABSTRACT + ACC_INTERFACE,
|
||||
"AnnotationWithHashCode", null,
|
||||
"java/lang/Object", new String[]{"java/lang/annotation/Annotation"});
|
||||
|
||||
{
|
||||
av0 = cw.visitAnnotation("Ljava/lang/annotation/Retention;", true);
|
||||
av0.visitEnum("value", "Ljava/lang/annotation/RetentionPolicy;",
|
||||
"RUNTIME");
|
||||
av0.visitEnd();
|
||||
}
|
||||
{
|
||||
mv = cw.visitMethod(ACC_PUBLIC + ACC_ABSTRACT, "hashCode", "()I", null, null);
|
||||
mv.visitEnd();
|
||||
}
|
||||
{
|
||||
av0 = mv.visitAnnotationDefault();
|
||||
av0.visit(null, new Integer(1));
|
||||
av0.visitEnd();
|
||||
}
|
||||
cw.visitEnd();
|
||||
|
||||
return cw.toByteArray();
|
||||
}
|
||||
}
|
||||
|
||||
/* Following code creates equivalent classfile, which is not allowed by javac:
|
||||
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
public @interface AnnotationWithDefaultMember {
|
||||
int m() default 1;
|
||||
default int d() default 2 { return 2; }
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
private static class AnnotationWithDefaultMemberDump implements Opcodes {
|
||||
public static byte[] dump() throws Exception {
|
||||
ClassWriter cw = new ClassWriter(0);
|
||||
MethodVisitor mv, dv;
|
||||
AnnotationVisitor av0;
|
||||
|
||||
cw.visit(52, ACC_PUBLIC + ACC_ANNOTATION + ACC_ABSTRACT + ACC_INTERFACE,
|
||||
"AnnotationWithDefaultMember", null,
|
||||
"java/lang/Object", new String[]{"java/lang/annotation/Annotation"});
|
||||
|
||||
{
|
||||
av0 = cw.visitAnnotation("Ljava/lang/annotation/Retention;", true);
|
||||
av0.visitEnum("value", "Ljava/lang/annotation/RetentionPolicy;",
|
||||
"RUNTIME");
|
||||
av0.visitEnd();
|
||||
}
|
||||
{
|
||||
mv = cw.visitMethod(ACC_PUBLIC + ACC_ABSTRACT, "m", "()I", null, null);
|
||||
mv.visitEnd();
|
||||
}
|
||||
{
|
||||
av0 = mv.visitAnnotationDefault();
|
||||
av0.visit(null, new Integer(1));
|
||||
av0.visitEnd();
|
||||
}
|
||||
{
|
||||
dv = cw.visitMethod(ACC_PUBLIC, "d", "()I", null, null);
|
||||
dv.visitMaxs(1, 1);
|
||||
dv.visitCode();
|
||||
dv.visitInsn(Opcodes.ICONST_2);
|
||||
dv.visitInsn(Opcodes.IRETURN);
|
||||
dv.visitEnd();
|
||||
}
|
||||
{
|
||||
av0 = dv.visitAnnotationDefault();
|
||||
av0.visit(null, new Integer(2));
|
||||
av0.visitEnd();
|
||||
}
|
||||
cw.visitEnd();
|
||||
|
||||
return cw.toByteArray();
|
||||
}
|
||||
}
|
||||
|
||||
/* Following code creates equivalent classfile, which is not allowed by javac:
|
||||
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
public interface AnnotationWithoutAnnotationAccessModifier extends java.lang.annotation.Annotation {
|
||||
int m() default 1;
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
private static class AnnotationWithoutAnnotationAccessModifierDump implements Opcodes {
|
||||
public static byte[] dump() throws Exception {
|
||||
ClassWriter cw = new ClassWriter(0);
|
||||
MethodVisitor mv;
|
||||
AnnotationVisitor av0;
|
||||
|
||||
cw.visit(52, ACC_PUBLIC + /* ACC_ANNOTATION +*/ ACC_ABSTRACT + ACC_INTERFACE,
|
||||
"AnnotationWithoutAnnotationAccessModifier", null,
|
||||
"java/lang/Object", new String[]{"java/lang/annotation/Annotation"});
|
||||
|
||||
{
|
||||
av0 = cw.visitAnnotation("Ljava/lang/annotation/Retention;", true);
|
||||
av0.visitEnum("value", "Ljava/lang/annotation/RetentionPolicy;",
|
||||
"RUNTIME");
|
||||
av0.visitEnd();
|
||||
}
|
||||
{
|
||||
mv = cw.visitMethod(ACC_PUBLIC + ACC_ABSTRACT, "m", "()I", null, null);
|
||||
mv.visitEnd();
|
||||
}
|
||||
{
|
||||
av0 = mv.visitAnnotationDefault();
|
||||
av0.visit(null, new Integer(1));
|
||||
av0.visitEnd();
|
||||
}
|
||||
cw.visitEnd();
|
||||
|
||||
return cw.toByteArray();
|
||||
}
|
||||
}
|
||||
|
||||
/* Following code creates equivalent classfile, which is not allowed by javac
|
||||
since AnnotationWithoutAnnotationAccessModifier is not marked with ACC_ANNOTATION:
|
||||
|
||||
@GoodAnnotation
|
||||
@AnnotationWithoutAnnotationAccessModifier
|
||||
public interface HolderX {
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
private static class HolderXDump implements Opcodes {
|
||||
public static byte[] dump() throws Exception {
|
||||
ClassWriter cw = new ClassWriter(0);
|
||||
|
||||
cw.visit(52, ACC_PUBLIC + ACC_ABSTRACT + ACC_INTERFACE,
|
||||
"HolderX", null,
|
||||
"java/lang/Object", new String[0]);
|
||||
|
||||
{
|
||||
AnnotationVisitor av0;
|
||||
av0 = cw.visitAnnotation("LGoodAnnotation;", true);
|
||||
av0.visitEnd();
|
||||
av0 = cw.visitAnnotation("LAnnotationWithoutAnnotationAccessModifier;", true);
|
||||
av0.visitEnd();
|
||||
}
|
||||
cw.visitEnd();
|
||||
|
||||
return cw.toByteArray();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
33
jdk/test/java/lang/annotation/GoodAnnotation.java
Normal file
33
jdk/test/java/lang/annotation/GoodAnnotation.java
Normal file
@ -0,0 +1,33 @@
|
||||
/*
|
||||
* Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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.
|
||||
*/
|
||||
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
|
||||
/**
|
||||
* Simple conforming runtime annotation.
|
||||
*/
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
public @interface GoodAnnotation {}
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -167,7 +167,7 @@ public class ShutdownGracefully
|
||||
exception = e;
|
||||
} finally {
|
||||
if (rmid != null)
|
||||
rmid.destroy();
|
||||
rmid.cleanup();
|
||||
}
|
||||
if (exception != null)
|
||||
TestLibrary.bomb("\nexception thrown in test: ", exception);
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -277,10 +277,14 @@ public class Main {
|
||||
try {
|
||||
Process client = new ProcessBuilder(clientProcessStr).
|
||||
inheritIO().start();
|
||||
client.waitFor();
|
||||
int exitValue = client.exitValue();
|
||||
if (0 != exitValue) {
|
||||
die("Error: error happened in client process, exitValue = " + exitValue);
|
||||
try {
|
||||
client.waitFor();
|
||||
int exitValue = client.exitValue();
|
||||
if (0 != exitValue) {
|
||||
die("Error: error happened in client process, exitValue = " + exitValue);
|
||||
}
|
||||
} finally {
|
||||
client.destroyForcibly();
|
||||
}
|
||||
} catch (IOException ex) {
|
||||
die("Error: Unable start client process, ex=" + ex.getMessage());
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2001, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2001, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -75,6 +75,7 @@ public class KeepAliveDuringCall implements ShutdownMonitor {
|
||||
System.err.println("\nRegression test for bug 4308492\n");
|
||||
|
||||
KeepAliveDuringCall obj = new KeepAliveDuringCall();
|
||||
JavaVM jvm = null;
|
||||
|
||||
try {
|
||||
UnicastRemoteObject.exportObject(obj);
|
||||
@ -88,9 +89,10 @@ public class KeepAliveDuringCall implements ShutdownMonitor {
|
||||
System.err.println("bound shutdown monitor in local registry");
|
||||
|
||||
System.err.println("starting remote ShutdownImpl VM...");
|
||||
(new JavaVM("ShutdownImpl",
|
||||
jvm = new JavaVM("ShutdownImpl",
|
||||
"-Drmi.registry.port=" +
|
||||
registryPort, "")).start();
|
||||
registryPort, "");
|
||||
jvm.start();
|
||||
|
||||
Shutdown s;
|
||||
synchronized (obj.lock) {
|
||||
@ -132,6 +134,9 @@ public class KeepAliveDuringCall implements ShutdownMonitor {
|
||||
"TEST FAILED: unexpected exception", e);
|
||||
}
|
||||
} finally {
|
||||
if (jvm != null) {
|
||||
jvm.destroy();
|
||||
}
|
||||
try {
|
||||
UnicastRemoteObject.unexportObject(obj, true);
|
||||
} catch (RemoteException e) {
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2001, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2001, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -82,6 +82,7 @@ public class LeaseCheckInterval implements Remote, Unreferenced {
|
||||
String.valueOf(LEASE_VALUE));
|
||||
|
||||
LeaseCheckInterval obj = new LeaseCheckInterval();
|
||||
JavaVM jvm = null;
|
||||
|
||||
try {
|
||||
UnicastRemoteObject.exportObject(obj);
|
||||
@ -96,8 +97,9 @@ public class LeaseCheckInterval implements Remote, Unreferenced {
|
||||
|
||||
synchronized (obj.lock) {
|
||||
System.err.println("starting remote client VM...");
|
||||
(new JavaVM("SelfTerminator", "-Drmi.registry.port=" +
|
||||
registryPort, "")).start();
|
||||
jvm = new JavaVM("SelfTerminator", "-Drmi.registry.port=" +
|
||||
registryPort, "");
|
||||
jvm.start();
|
||||
|
||||
System.err.println("waiting for unreferenced() callback...");
|
||||
obj.lock.wait(TIMEOUT);
|
||||
@ -120,6 +122,9 @@ public class LeaseCheckInterval implements Remote, Unreferenced {
|
||||
"TEST FAILED: unexpected exception: " + e.toString());
|
||||
}
|
||||
} finally {
|
||||
if (jvm != null) {
|
||||
jvm.destroy();
|
||||
}
|
||||
/*
|
||||
* When all is said and done, try to unexport the remote object
|
||||
* so that the VM has a chance to exit.
|
||||
|
@ -224,7 +224,7 @@ public class JavaVM {
|
||||
|
||||
public void destroy() {
|
||||
if (vm != null) {
|
||||
vm.destroy();
|
||||
vm.destroyForcibly();
|
||||
}
|
||||
vm = null;
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1998, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1998, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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,7 @@ public class CheckFQDN extends UnicastRemoteObject
|
||||
String propertyValue,
|
||||
String extraProp)
|
||||
{
|
||||
JavaVM jvm = null;
|
||||
try {
|
||||
String propOption = "";
|
||||
String equal = "";
|
||||
@ -119,7 +120,7 @@ public class CheckFQDN extends UnicastRemoteObject
|
||||
}
|
||||
|
||||
// create a client to tell checkFQDN what its rmi name is.
|
||||
JavaVM jvm = new JavaVM("CheckFQDNClient",
|
||||
jvm = new JavaVM("CheckFQDNClient",
|
||||
propOption + property +
|
||||
equal +
|
||||
propertyValue + extraProp +
|
||||
@ -140,6 +141,10 @@ public class CheckFQDN extends UnicastRemoteObject
|
||||
|
||||
} catch (Exception e) {
|
||||
TestLibrary.bomb(e);
|
||||
} finally {
|
||||
if (jvm != null) {
|
||||
jvm.destroy();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1998, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1998, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -108,8 +108,12 @@ public class CheckLeaseLeak extends UnicastRemoteObject implements LeaseLeak {
|
||||
registryPort,
|
||||
"");
|
||||
|
||||
if (jvm.execute() != 0) {
|
||||
TestLibrary.bomb("Client process failed");
|
||||
try {
|
||||
if (jvm.execute() != 0) {
|
||||
TestLibrary.bomb("Client process failed");
|
||||
}
|
||||
} finally {
|
||||
jvm.destroy();
|
||||
}
|
||||
}
|
||||
numLeft = getDGCLeaseTableSize();
|
||||
|
200
jdk/test/java/util/Calendar/Bug8167273.java
Normal file
200
jdk/test/java/util/Calendar/Bug8167273.java
Normal file
@ -0,0 +1,200 @@
|
||||
/*
|
||||
* Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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 8167273
|
||||
* @summary Test
|
||||
* Era names retrieved from Calendar and DateFormatSymbols class
|
||||
* should match for default providers preference
|
||||
* as well as when preference list is [COMPAT, CLDR],
|
||||
* Empty era names are not retrieved from DateformatSymbols class.
|
||||
* Equivalent locales specified for [zh-HK, no-NO, no] for
|
||||
* CLDR Provider works correctly.
|
||||
* Implict COMPAT Locale nb is reflected in available locales
|
||||
* for all Providers for COMPAT.
|
||||
* @modules java.base/sun.util.locale.provider
|
||||
* java.base/sun.util.spi
|
||||
* jdk.localedata
|
||||
* @run main/othervm -Djava.locale.providers=COMPAT,CLDR Bug8167273 testEraName
|
||||
* @run main/othervm Bug8167273 testEraName
|
||||
* @run main/othervm -Djava.locale.providers=CLDR Bug8167273 testCldr
|
||||
* @run main/othervm Bug8167273 testEmptyEraNames
|
||||
* @run main/othervm -Djava.locale.providers=COMPAT Bug8167273 testCompat
|
||||
*/
|
||||
import java.text.DateFormatSymbols;
|
||||
import java.util.Arrays;
|
||||
import java.util.Calendar;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import sun.util.locale.provider.LocaleProviderAdapter;
|
||||
import sun.util.locale.provider.LocaleProviderAdapter.Type;
|
||||
|
||||
public class Bug8167273 {
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
switch (args[0]) {
|
||||
case "testEraName":
|
||||
testEraName();
|
||||
break;
|
||||
case "testEmptyEraNames":
|
||||
testEmptyEraNames();
|
||||
break;
|
||||
case "testCldr":
|
||||
testCldrSupportedLocales();
|
||||
break;
|
||||
case "testCompat":
|
||||
testCompatSupportedLocale();
|
||||
break;
|
||||
default:
|
||||
throw new RuntimeException("no test was specified.");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* tests that era names retrieved from Calendar.getDisplayNames map should
|
||||
* match with that of Era names retrieved from DateFormatSymbols.getEras()
|
||||
* method for all Gregorian Calendar locales .
|
||||
*/
|
||||
public static void testEraName() {
|
||||
Set<Locale> allLocales = Set.of(Locale.getAvailableLocales());
|
||||
Set<Locale> JpThlocales = Set.of(
|
||||
new Locale("th", "TH"),
|
||||
new Locale("ja", "JP", "JP"), new Locale("th", "TH", "TH")
|
||||
);
|
||||
Set<Locale> allLocs = new HashSet<>(allLocales);
|
||||
// Removing Japense and Thai Locales to check Gregorian Calendar Locales
|
||||
allLocs.removeAll(JpThlocales);
|
||||
allLocs.forEach((locale) -> {
|
||||
Calendar cal = Calendar.getInstance(locale);
|
||||
Map<String, Integer> names = cal.getDisplayNames(Calendar.ERA, Calendar.ALL_STYLES, locale);
|
||||
DateFormatSymbols symbols = new DateFormatSymbols(locale);
|
||||
String[] eras = symbols.getEras();
|
||||
for (String era : eras) {
|
||||
if (!names.containsKey(era)) {
|
||||
reportMismatch(names.keySet(), eras, locale);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private static void reportMismatch(Set<String> CalendarEras, String[] dfsEras, Locale locale) {
|
||||
System.out.println("For Locale " + locale + "era names in calendar map are " + CalendarEras);
|
||||
for (String era : dfsEras) {
|
||||
System.out.println("For Locale " + locale + " era names in DateFormatSymbols era array are " + era);
|
||||
}
|
||||
throw new RuntimeException(" Era name retrived from Calendar class do not match with"
|
||||
+ " retrieved from DateFormatSymbols for Locale " + locale);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* tests that Eras names returned from DateFormatSymbols.getEras()
|
||||
* and Calendar.getDisplayNames() should not be empty for any Locale.
|
||||
*/
|
||||
private static void testEmptyEraNames() {
|
||||
Set<Locale> allLocales = Set.of(Locale.getAvailableLocales());
|
||||
allLocales.forEach((loc) -> {
|
||||
DateFormatSymbols dfs = new DateFormatSymbols(loc);
|
||||
Calendar cal = Calendar.getInstance(loc);
|
||||
Map<String, Integer> names = cal.getDisplayNames(Calendar.ERA, Calendar.ALL_STYLES, loc);
|
||||
Set<String> CalendarEraNames = names.keySet();
|
||||
String[] eras = dfs.getEras();
|
||||
for (String era : eras) {
|
||||
if (era.isEmpty()) {
|
||||
throw new RuntimeException("Empty era names retrieved for DateFomatSymbols.getEras"
|
||||
+ " for locale " + loc);
|
||||
}
|
||||
}
|
||||
CalendarEraNames.stream().filter((erakey) -> (erakey.isEmpty())).forEachOrdered((l) -> {
|
||||
throw new RuntimeException("Empty era names retrieved for Calendar.getDisplayName"
|
||||
+ " for locale " + loc);
|
||||
});
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* tests that CLDR provider should return true for locale zh_HK, no-NO and
|
||||
* no.
|
||||
*/
|
||||
private static void testCldrSupportedLocales() {
|
||||
Set<Locale> locales = Set.of(Locale.forLanguageTag("zh-HK"),
|
||||
Locale.forLanguageTag("no-NO"),
|
||||
Locale.forLanguageTag("no"));
|
||||
LocaleProviderAdapter cldr = LocaleProviderAdapter.forType(Type.CLDR);
|
||||
Set<Locale> availableLocs = Set.of(cldr.getAvailableLocales());
|
||||
Set<String> langtags = new HashSet<>();
|
||||
availableLocs.forEach((loc) -> {
|
||||
langtags.add(loc.toLanguageTag());
|
||||
});
|
||||
|
||||
locales.stream().filter((loc) -> (!cldr.isSupportedProviderLocale(loc, langtags))).forEachOrdered((loc) -> {
|
||||
throw new RuntimeException("Locale " + loc + " is not supported by CLDR Locale Provider");
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests that locale nb should be supported by JRELocaleProvider .
|
||||
*/
|
||||
private static void testCompatSupportedLocale() {
|
||||
LocaleProviderAdapter jre = LocaleProviderAdapter.forJRE();
|
||||
checkPresenceCompat("BreakIteratorProvider",
|
||||
jre.getBreakIteratorProvider().getAvailableLocales());
|
||||
checkPresenceCompat("CollatorProvider",
|
||||
jre.getCollatorProvider().getAvailableLocales());
|
||||
checkPresenceCompat("DateFormatProvider",
|
||||
jre.getDateFormatProvider().getAvailableLocales());
|
||||
checkPresenceCompat("DateFormatSymbolsProvider",
|
||||
jre.getDateFormatSymbolsProvider().getAvailableLocales());
|
||||
checkPresenceCompat("DecimalFormatSymbolsProvider",
|
||||
jre.getDecimalFormatSymbolsProvider().getAvailableLocales());
|
||||
checkPresenceCompat("NumberFormatProvider",
|
||||
jre.getNumberFormatProvider().getAvailableLocales());
|
||||
checkPresenceCompat("CurrencyNameProvider",
|
||||
jre.getCurrencyNameProvider().getAvailableLocales());
|
||||
checkPresenceCompat("LocaleNameProvider",
|
||||
jre.getLocaleNameProvider().getAvailableLocales());
|
||||
checkPresenceCompat("TimeZoneNameProvider",
|
||||
jre.getTimeZoneNameProvider().getAvailableLocales());
|
||||
checkPresenceCompat("CalendarDataProvider",
|
||||
jre.getCalendarDataProvider().getAvailableLocales());
|
||||
checkPresenceCompat("CalendarNameProvider",
|
||||
jre.getCalendarNameProvider().getAvailableLocales());
|
||||
checkPresenceCompat("CalendarProvider",
|
||||
jre.getCalendarProvider().getAvailableLocales());
|
||||
}
|
||||
|
||||
private static void checkPresenceCompat(String testName, Locale[] got) {
|
||||
List<Locale> gotLocalesList = Arrays.asList(got);
|
||||
Locale nb = Locale.forLanguageTag("nb");
|
||||
if (!gotLocalesList.contains(nb)) {
|
||||
throw new RuntimeException("Locale nb not supported by JREProvider for "
|
||||
+ testName + " test ");
|
||||
}
|
||||
}
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2001, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2001, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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,11 +32,14 @@
|
||||
*/
|
||||
|
||||
import java.io.*;
|
||||
import java.net.*;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.SocketTimeoutException;
|
||||
|
||||
import javax.net.ssl.*;
|
||||
import java.util.*;
|
||||
import java.security.*;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
/**
|
||||
* Session reuse time-out tests cover the cases below:
|
||||
@ -44,9 +47,9 @@ import java.util.concurrent.atomic.AtomicInteger;
|
||||
* its lifetime exceeds x.
|
||||
* 2. Effect of changing the timeout limit.
|
||||
* The test suite does not cover the default timeout(24 hours) usage. This
|
||||
* case has been tested independetly.
|
||||
* case has been tested independently.
|
||||
*
|
||||
* Invairant for passing this test is, at any given time,
|
||||
* Invariant for passing this test is, at any given time,
|
||||
* lifetime of a session < current_session_timeout, such that
|
||||
* current_session_timeout > 0, for all sessions cached by the session
|
||||
* context.
|
||||
@ -80,7 +83,7 @@ public class SessionTimeOutTests {
|
||||
/*
|
||||
* Is the server ready to serve?
|
||||
*/
|
||||
AtomicInteger serverReady = new AtomicInteger(PORTS);
|
||||
private final CountDownLatch serverCondition = new CountDownLatch(PORTS);
|
||||
|
||||
/*
|
||||
* Turn on SSL debugging?
|
||||
@ -98,9 +101,6 @@ public class SessionTimeOutTests {
|
||||
|
||||
/*
|
||||
* Define the server side of the test.
|
||||
*
|
||||
* If the server prematurely exits, serverReady will be set to zero
|
||||
* to avoid infinite hangs.
|
||||
*/
|
||||
|
||||
/*
|
||||
@ -108,31 +108,44 @@ public class SessionTimeOutTests {
|
||||
*/
|
||||
static int MAX_ACTIVE_CONNECTIONS = 3;
|
||||
|
||||
void doServerSide(int serverPort, int serverConns) throws Exception {
|
||||
/*
|
||||
* Divide the max connections among the available server ports.
|
||||
* The use of more than one server port ensures creation of more
|
||||
* than one session.
|
||||
*/
|
||||
private static final int serverConns = MAX_ACTIVE_CONNECTIONS / PORTS;
|
||||
private static final int remainingConns = MAX_ACTIVE_CONNECTIONS % PORTS;
|
||||
|
||||
SSLServerSocket sslServerSocket =
|
||||
(SSLServerSocket) sslssf.createServerSocket(serverPort);
|
||||
int slot = createdPorts.getAndIncrement();
|
||||
private static final int TIMEOUT = 30000; // in millisecond
|
||||
|
||||
void doServerSide(int slot, int serverConns) throws Exception {
|
||||
|
||||
SSLServerSocket sslServerSocket
|
||||
= (SSLServerSocket) sslssf.createServerSocket(0);
|
||||
sslServerSocket.setSoTimeout(TIMEOUT);
|
||||
serverPorts[slot] = sslServerSocket.getLocalPort();
|
||||
|
||||
/*
|
||||
* Signal Client, we're ready for his connect.
|
||||
* Signal Client, one server is ready for its connect.
|
||||
*/
|
||||
serverReady.getAndDecrement();
|
||||
int read = 0;
|
||||
int nConnections = 0;
|
||||
SSLSession sessions [] = new SSLSession [serverConns];
|
||||
serverCondition.countDown();
|
||||
|
||||
while (nConnections < serverConns) {
|
||||
SSLSocket sslSocket = (SSLSocket) sslServerSocket.accept();
|
||||
for (int nConnections = 0; nConnections < serverConns; nConnections++) {
|
||||
SSLSocket sslSocket = null;
|
||||
try {
|
||||
sslSocket = (SSLSocket) sslServerSocket.accept();
|
||||
} catch (SocketTimeoutException ste) {
|
||||
System.out.println(
|
||||
"No incoming client connection. Ignore in server side.");
|
||||
continue;
|
||||
}
|
||||
InputStream sslIS = sslSocket.getInputStream();
|
||||
OutputStream sslOS = sslSocket.getOutputStream();
|
||||
read = sslIS.read();
|
||||
sessions[nConnections] = sslSocket.getSession();
|
||||
sslIS.read();
|
||||
sslSocket.getSession();
|
||||
sslOS.write(85);
|
||||
sslOS.flush();
|
||||
sslSocket.close();
|
||||
nConnections++;
|
||||
}
|
||||
}
|
||||
|
||||
@ -143,35 +156,49 @@ public class SessionTimeOutTests {
|
||||
* to avoid infinite hangs.
|
||||
*/
|
||||
void doClientSide() throws Exception {
|
||||
|
||||
/*
|
||||
* Wait for server to get started.
|
||||
*/
|
||||
while (serverReady.get() > 0) {
|
||||
Thread.sleep(50);
|
||||
if (!serverCondition.await(TIMEOUT, TimeUnit.MILLISECONDS)) {
|
||||
System.out.println(
|
||||
"The server side is not ready yet. Ignore in client side.");
|
||||
return;
|
||||
}
|
||||
|
||||
int nConnections = 0;
|
||||
SSLSocket sslSockets[] = new SSLSocket [MAX_ACTIVE_CONNECTIONS];
|
||||
Vector sessions = new Vector();
|
||||
SSLSocket sslSockets[] = new SSLSocket[MAX_ACTIVE_CONNECTIONS];
|
||||
Vector<SSLSession> sessions = new Vector<>();
|
||||
SSLSessionContext sessCtx = sslctx.getClientSessionContext();
|
||||
|
||||
sessCtx.setSessionTimeout(10); // in secs
|
||||
int timeout = sessCtx.getSessionTimeout();
|
||||
while (nConnections < MAX_ACTIVE_CONNECTIONS) {
|
||||
for (int nConnections = 0; nConnections < MAX_ACTIVE_CONNECTIONS;
|
||||
nConnections++) {
|
||||
// divide the connections among the available server ports
|
||||
sslSockets[nConnections] = (SSLSocket) sslsf.
|
||||
createSocket("localhost",
|
||||
serverPorts [nConnections % (serverPorts.length)]);
|
||||
try {
|
||||
SSLSocket sslSocket = (SSLSocket) sslsf.createSocket();
|
||||
sslSocket.connect(new InetSocketAddress("localhost",
|
||||
serverPorts[nConnections % serverPorts.length]),
|
||||
TIMEOUT);
|
||||
sslSockets[nConnections] = sslSocket;
|
||||
} catch (IOException ioe) {
|
||||
// The server side may be impacted by naughty test cases or
|
||||
// third party routines, and cannot accept connections.
|
||||
//
|
||||
// Just ignore the test if the connection cannot be
|
||||
// established.
|
||||
System.out.println(
|
||||
"Cannot make a connection in time. Ignore in client side.");
|
||||
continue;
|
||||
}
|
||||
|
||||
InputStream sslIS = sslSockets[nConnections].getInputStream();
|
||||
OutputStream sslOS = sslSockets[nConnections].getOutputStream();
|
||||
sslOS.write(237);
|
||||
sslOS.flush();
|
||||
int read = sslIS.read();
|
||||
sslIS.read();
|
||||
SSLSession sess = sslSockets[nConnections].getSession();
|
||||
if (!sessions.contains(sess))
|
||||
sessions.add(sess);
|
||||
nConnections++;
|
||||
}
|
||||
System.out.println();
|
||||
System.out.println("Current timeout is set to: " + timeout);
|
||||
@ -217,7 +244,7 @@ public class SessionTimeOutTests {
|
||||
}
|
||||
|
||||
// check the ids returned by the enumerator
|
||||
Enumeration e = sessCtx.getIds();
|
||||
Enumeration<byte[]> e = sessCtx.getIds();
|
||||
System.out.println("----------------------------------------"
|
||||
+ "-----------------------");
|
||||
System.out.println("Testing SSLSessionContext.getId()......");
|
||||
@ -262,7 +289,7 @@ public class SessionTimeOutTests {
|
||||
|
||||
System.out.println(" " + isTimedout);
|
||||
}
|
||||
for (int i = 0; i < nConnections; i++) {
|
||||
for (int i = 0; i < sslSockets.length; i++) {
|
||||
sslSockets[i].close();
|
||||
}
|
||||
System.out.println("----------------------------------------"
|
||||
@ -290,7 +317,6 @@ public class SessionTimeOutTests {
|
||||
*/
|
||||
|
||||
int serverPorts[] = new int[PORTS];
|
||||
AtomicInteger createdPorts = new AtomicInteger(0);
|
||||
static SSLServerSocketFactory sslssf;
|
||||
static SSLSocketFactory sslsf;
|
||||
static SSLContext sslctx;
|
||||
@ -311,6 +337,9 @@ public class SessionTimeOutTests {
|
||||
System.setProperty("javax.net.ssl.trustStore", trustFilename);
|
||||
System.setProperty("javax.net.ssl.trustStorePassword", passwd);
|
||||
|
||||
if (debug)
|
||||
System.setProperty("javax.net.debug", "all");
|
||||
|
||||
sslctx = SSLContext.getInstance("TLS");
|
||||
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
|
||||
KeyStore ks = KeyStore.getInstance("JKS");
|
||||
@ -319,8 +348,6 @@ public class SessionTimeOutTests {
|
||||
sslctx.init(kmf.getKeyManagers(), null, null);
|
||||
sslssf = (SSLServerSocketFactory) sslctx.getServerSocketFactory();
|
||||
sslsf = (SSLSocketFactory) sslctx.getSocketFactory();
|
||||
if (debug)
|
||||
System.setProperty("javax.net.debug", "all");
|
||||
|
||||
/*
|
||||
* Start the tests.
|
||||
@ -342,33 +369,25 @@ public class SessionTimeOutTests {
|
||||
* create the SSLServerSocket and SSLSocket factories
|
||||
*/
|
||||
|
||||
/*
|
||||
* Divide the max connections among the available server ports.
|
||||
* The use of more than one server port ensures creation of more
|
||||
* than one session.
|
||||
*/
|
||||
int serverConns = MAX_ACTIVE_CONNECTIONS / (serverPorts.length);
|
||||
int remainingConns = MAX_ACTIVE_CONNECTIONS % (serverPorts.length);
|
||||
|
||||
Exception startException = null;
|
||||
try {
|
||||
if (separateServerThread) {
|
||||
for (int i = 0; i < serverPorts.length; i++) {
|
||||
// distribute remaining connections among the
|
||||
// vailable ports
|
||||
// available ports
|
||||
if (i < remainingConns)
|
||||
startServer(serverPorts[i], (serverConns + 1), true);
|
||||
startServer(i, (serverConns + 1), true);
|
||||
else
|
||||
startServer(serverPorts[i], serverConns, true);
|
||||
startServer(i, serverConns, true);
|
||||
}
|
||||
startClient(false);
|
||||
} else {
|
||||
startClient(true);
|
||||
for (int i = 0; i < serverPorts.length; i++) {
|
||||
for (int i = 0; i < PORTS; i++) {
|
||||
if (i < remainingConns)
|
||||
startServer(serverPorts[i], (serverConns + 1), false);
|
||||
startServer(i, (serverConns + 1), false);
|
||||
else
|
||||
startServer(serverPorts[i], serverConns, false);
|
||||
startServer(i, serverConns, false);
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
@ -434,13 +453,13 @@ public class SessionTimeOutTests {
|
||||
// Fall-through: no exception to throw!
|
||||
}
|
||||
|
||||
void startServer(final int port, final int nConns,
|
||||
boolean newThread) throws Exception {
|
||||
void startServer(final int slot, final int nConns, boolean newThread)
|
||||
throws Exception {
|
||||
if (newThread) {
|
||||
serverThread = new Thread() {
|
||||
public void run() {
|
||||
try {
|
||||
doServerSide(port, nConns);
|
||||
doServerSide(slot, nConns);
|
||||
} catch (Exception e) {
|
||||
/*
|
||||
* Our server thread just died.
|
||||
@ -449,7 +468,6 @@ public class SessionTimeOutTests {
|
||||
*/
|
||||
System.err.println("Server died...");
|
||||
e.printStackTrace();
|
||||
serverReady.set(0);
|
||||
serverException = e;
|
||||
}
|
||||
}
|
||||
@ -457,11 +475,9 @@ public class SessionTimeOutTests {
|
||||
serverThread.start();
|
||||
} else {
|
||||
try {
|
||||
doServerSide(port, nConns);
|
||||
doServerSide(slot, nConns);
|
||||
} catch (Exception e) {
|
||||
serverException = e;
|
||||
} finally {
|
||||
serverReady.set(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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,8 +66,11 @@ public class RmiIiopReturnValueTest {
|
||||
private static Process rmiServerProcess;
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
startTestComponents();
|
||||
stopTestComponents();
|
||||
try {
|
||||
startTestComponents();
|
||||
} finally {
|
||||
stopTestComponents();
|
||||
}
|
||||
System.err.println("Test completed OK ");
|
||||
}
|
||||
|
||||
@ -142,11 +145,13 @@ public class RmiIiopReturnValueTest {
|
||||
}
|
||||
|
||||
static void stopOrbd() throws Exception {
|
||||
System.out.println("RmiIiopReturnValueTest.stopOrbd: destroy orbdProcess ");
|
||||
orbdProcess.destroyForcibly();
|
||||
orbdProcess.waitFor();
|
||||
System.out.println("orbd exitCode:"
|
||||
+ orbdProcess.exitValue());
|
||||
if (orbdProcess != null) {
|
||||
System.out.println("RmiIiopReturnValueTest.stopOrbd: destroy orbdProcess ");
|
||||
orbdProcess.destroyForcibly();
|
||||
orbdProcess.waitFor();
|
||||
System.out.println("orbd exitCode:"
|
||||
+ orbdProcess.exitValue());
|
||||
}
|
||||
}
|
||||
|
||||
static void executeRmiIiopClient() throws Exception {
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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,8 +61,11 @@ public class ConcurrentHashMapTest {
|
||||
private static Process rmiServerProcess;
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
startTestComponents();
|
||||
stopTestComponents();
|
||||
try {
|
||||
startTestComponents();
|
||||
} finally {
|
||||
stopTestComponents();
|
||||
}
|
||||
System.err.println("Test completed OK ");
|
||||
}
|
||||
|
||||
@ -124,17 +127,21 @@ public class ConcurrentHashMapTest {
|
||||
}
|
||||
|
||||
static void stopRmiIiopServer() throws Exception {
|
||||
rmiServerProcess.destroyForcibly();
|
||||
rmiServerProcess.waitFor();
|
||||
System.out.println("serverProcess exitCode:"
|
||||
+ rmiServerProcess.exitValue());
|
||||
if (rmiServerProcess != null) {
|
||||
rmiServerProcess.destroyForcibly();
|
||||
rmiServerProcess.waitFor();
|
||||
System.out.println("serverProcess exitCode:"
|
||||
+ rmiServerProcess.exitValue());
|
||||
}
|
||||
}
|
||||
|
||||
static void stopOrbd() throws Exception {
|
||||
orbdProcess.destroyForcibly();
|
||||
orbdProcess.waitFor();
|
||||
System.out.println("orbd exitCode:"
|
||||
+ orbdProcess.exitValue());
|
||||
if (orbdProcess != null) {
|
||||
orbdProcess.destroyForcibly();
|
||||
orbdProcess.waitFor();
|
||||
System.out.println("orbd exitCode:"
|
||||
+ orbdProcess.exitValue());
|
||||
}
|
||||
}
|
||||
|
||||
static void executeRmiIiopClient() throws Exception {
|
||||
|
@ -0,0 +1,74 @@
|
||||
/*
|
||||
* Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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.EventQueue;
|
||||
|
||||
import javax.swing.UIDefaults;
|
||||
import javax.swing.UIManager;
|
||||
import javax.swing.UnsupportedLookAndFeelException;
|
||||
import javax.swing.plaf.metal.MetalLookAndFeel;
|
||||
import javax.swing.plaf.nimbus.NimbusLookAndFeel;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 8149879
|
||||
* @summary The users should not register internal resource bundles.
|
||||
*/
|
||||
public class InternalResourceBundle {
|
||||
|
||||
public static void main(final String[] args) throws Exception {
|
||||
EventQueue.invokeAndWait(() -> {
|
||||
// Indirectly register resource bundle from Nimbus, it will be used
|
||||
// by default
|
||||
try {
|
||||
UIManager.setLookAndFeel(new NimbusLookAndFeel());
|
||||
} catch (final UnsupportedLookAndFeelException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
UIDefaults defaults = UIManager.getDefaults();
|
||||
// Try to register resource bundle from Metal, which is
|
||||
// not enabled by default. This request should be skipped.
|
||||
defaults.addResourceBundle("com.sun.swing.internal.plaf.metal.resources.metal");
|
||||
|
||||
Object value = getValue(defaults);
|
||||
if (value != null) {
|
||||
throw new RuntimeException("value is not null = " + value);
|
||||
}
|
||||
|
||||
// Indirectly register resource bundle from Metal
|
||||
try {
|
||||
UIManager.setLookAndFeel(new MetalLookAndFeel());
|
||||
} catch (final UnsupportedLookAndFeelException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
value = getValue(defaults);
|
||||
if (value == null) {
|
||||
throw new RuntimeException("value is null");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private static Object getValue(UIDefaults defaults) {
|
||||
return defaults.get("MetalTitlePane.restore.titleAndMnemonic");
|
||||
}
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2002, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -52,7 +52,11 @@ public class Test4504153 {
|
||||
ByteArrayOutputStream err = new ByteArrayOutputStream();
|
||||
JavaVM vm = new JavaVM(StartRegistry.class.getName(),
|
||||
"-Dsun.rmi.transport.logLevel=v", "", out, err);
|
||||
vm.execute();
|
||||
try {
|
||||
vm.execute();
|
||||
} finally {
|
||||
vm.destroy();
|
||||
}
|
||||
|
||||
String errString = err.toString();
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2006, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -72,7 +72,11 @@ public class NoConsoleOutput {
|
||||
+ " --add-exports=java.rmi/sun.rmi.transport.tcp=ALL-UNNAMED"
|
||||
+ " -Djava.util.logging.config.file="
|
||||
+ loggingPropertiesFile, "", out, err);
|
||||
vm.execute();
|
||||
try {
|
||||
vm.execute();
|
||||
} finally {
|
||||
vm.destroy();
|
||||
}
|
||||
|
||||
/*
|
||||
* Verify that the subprocess had no System.err output.
|
||||
|
@ -0,0 +1,38 @@
|
||||
/*
|
||||
* Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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 8168075
|
||||
* @summary Ensure that security messages can be formatted during system class
|
||||
* loader initialization.
|
||||
* @build CustomClassLoader
|
||||
* @run main/othervm/java.security.policy=error.policy -Djava.security.manager -Djava.system.class.loader=CustomClassLoader BootMessages
|
||||
*/
|
||||
|
||||
public class BootMessages {
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
|
||||
}
|
||||
}
|
@ -0,0 +1,34 @@
|
||||
|
||||
/*
|
||||
* Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/*
|
||||
* A class loader that can be used in tests that require a custom class
|
||||
* loader. Its behavior is identical to ClassLoader.
|
||||
*/
|
||||
|
||||
public class CustomClassLoader extends ClassLoader {
|
||||
public CustomClassLoader(ClassLoader parent) {
|
||||
super(parent);
|
||||
}
|
||||
}
|
@ -0,0 +1,68 @@
|
||||
/*
|
||||
* Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
import java.util.*;
|
||||
import sun.security.util.Resources;
|
||||
import sun.security.util.LocalizedMessage;
|
||||
import java.text.MessageFormat;
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 8168075
|
||||
* @summary Ensure that security message formatting code is capable of
|
||||
* displaying all messages.
|
||||
* @modules java.base/sun.security.util
|
||||
*/
|
||||
|
||||
public class MessageFormatting {
|
||||
|
||||
private static final Object[] MSG_ARGS = new Integer[]{0, 1, 2};
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
|
||||
Resources resources = new Resources();
|
||||
Enumeration<String> keys = resources.getKeys();
|
||||
while (keys.hasMoreElements()) {
|
||||
String curKey = keys.nextElement();
|
||||
String formattedString = LocalizedMessage.getMessageUnbooted(curKey, MSG_ARGS);
|
||||
String msg = resources.getString(curKey);
|
||||
String expectedString = formatIfNecessary(msg, MSG_ARGS);
|
||||
if (!formattedString.equals(expectedString)) {
|
||||
System.err.println("Expected string:");
|
||||
System.err.println(expectedString);
|
||||
System.err.println("Actual string:");
|
||||
System.err.println(formattedString);
|
||||
throw new Exception("Incorrect message string");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static String formatIfNecessary(String str, Object[] args) {
|
||||
// message formatting code only formats messages with arguments
|
||||
if (str.indexOf('{') < 0) {
|
||||
return str;
|
||||
}
|
||||
MessageFormat format = new MessageFormat(str);
|
||||
return format.format(args);
|
||||
}
|
||||
}
|
@ -0,0 +1,5 @@
|
||||
grant {
|
||||
permission java.lang.RuntimePermission "createClassLoader";
|
||||
permission java.lang.RuntimePermission "";
|
||||
};
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -23,7 +23,7 @@
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 8038436 8158504 8065555 8167143
|
||||
* @bug 8038436 8158504 8065555 8167143 8167273
|
||||
* @summary Test for changes in 8038436
|
||||
* @modules java.base/sun.util.locale.provider
|
||||
* java.base/sun.util.spi
|
||||
@ -120,7 +120,7 @@ public class Bug8038436 {
|
||||
"fi, fi-FI, fr, fr-BE, fr-CA, fr-CH, fr-FR, ga, ga-IE, he, he-IL, " +
|
||||
"hi-IN, hr, hr-HR, hu, hu-HU, id, id-ID, is, is-IS, it, it-CH, it-IT, " +
|
||||
"ja, ja-JP, ko, ko-KR, lt, lt-LT, lv, lv-LV, mk, mk-MK, ms, ms-MY, mt, " +
|
||||
"mt-MT, nb-NO, nl, nl-BE, nl-NL, nn-NO, no, no-NO, no-NO, pl, pl-PL, pt, pt-BR, " +
|
||||
"mt-MT, nb, nb-NO, nl, nl-BE, nl-NL, nn-NO, no, no-NO, no-NO, pl, pl-PL, pt, pt-BR, " +
|
||||
"pt-PT, ro, ro-RO, ru, ru-RU, sk, sk-SK, sl, sl-SI, sq, sq-AL, sr, " +
|
||||
"sr-BA, sr-CS, sr-Latn, sr-Latn-ME, sr-ME, sr-RS, sv, sv-SE, th, th-TH, " +
|
||||
"tr, tr-TR, uk, uk-UA, und, vi, vi-VN, zh, zh-CN, zh-HK, zh-Hans-CN, " +
|
||||
@ -130,7 +130,7 @@ public class Bug8038436 {
|
||||
static final String[] decimalfspLocs = bipLocs;
|
||||
static final String[] calnpLocs = bipLocs;
|
||||
static final String[] cpLocs = ("ar, be, bg, ca, cs, da, el, es, et, fi, " +
|
||||
"fr, he, hi, hr, hu, is, ja, ko, lt, lv, mk, nb-NO, nn-NO, no, pl, ro, ru, sk, sl, " +
|
||||
"fr, he, hi, hr, hu, is, ja, ko, lt, lv, mk, nb, nb-NO, nn-NO, no, pl, ro, ru, sk, sl, " +
|
||||
"sq, sr, sr-Latn, sv, th, tr, uk, und, vi, zh, zh-HK, zh-Hant-HK, " +
|
||||
"zh-Hant-TW, zh-TW, ").split(",\\s*");
|
||||
static final String[] nfpLocs = ("ar, ar-AE, ar-BH, ar-DZ, ar-EG, ar-IQ, " +
|
||||
@ -144,7 +144,7 @@ public class Bug8038436 {
|
||||
"fr-LU, ga, ga-IE, he, he-IL, hi, hi-IN, hr, hr-HR, hu, hu-HU, id, " +
|
||||
"id-ID, is, is-IS, it, it-CH, it-IT, ja, ja-JP, " +
|
||||
"ja-JP-u-ca-japanese-x-lvariant-JP, ko, ko-KR, lt, lt-LT, lv, lv-LV, " +
|
||||
"mk, mk-MK, ms, ms-MY, mt, mt-MT, nb-NO, nl, nl-BE, nl-NL, nn-NO, " +
|
||||
"mk, mk-MK, ms, ms-MY, mt, mt-MT, nb, nb-NO, nl, nl-BE, nl-NL, nn-NO, " +
|
||||
"nn-NO, no, no-NO, pl, pl-PL, pt, pt-BR, pt-PT, ro, ro-RO, ru, ru-RU, " +
|
||||
"sk, sk-SK, sl, sl-SI, sq, sq-AL, sr, sr-BA, sr-CS, sr-Latn, " +
|
||||
"sr-Latn-BA, sr-Latn-ME, sr-Latn-RS, sr-ME, sr-RS, sv, sv-SE, th, " +
|
||||
@ -160,22 +160,22 @@ public class Bug8038436 {
|
||||
"es-PA, es-PE, es-PR, es-PY, es-SV, es-US, es-UY, es-VE, et-EE, fi-FI, " +
|
||||
"fr, fr-BE, fr-CA, fr-CH, fr-FR, fr-LU, ga-IE, he-IL, hi-IN, hr-HR, " +
|
||||
"hu-HU, id-ID, is-IS, it, it-CH, it-IT, ja, ja-JP, ko, ko-KR, lt-LT, " +
|
||||
"lv-LV, mk-MK, ms-MY, mt-MT, nb-NO, nl-BE, nl-NL, nn-NO, no-NO, pl-PL, pt, pt-BR, " +
|
||||
"lv-LV, mk-MK, ms-MY, mt-MT, nb, nb-NO, nl-BE, nl-NL, nn-NO, no-NO, pl-PL, pt, pt-BR, " +
|
||||
"pt-PT, ro-RO, ru-RU, sk-SK, sl-SI, sq-AL, sr-BA, sr-CS, sr-Latn-BA, " +
|
||||
"sr-Latn-ME, sr-Latn-RS, sr-ME, sr-RS, sv, sv-SE, th-TH, tr-TR, uk-UA, " +
|
||||
"und, vi-VN, zh-CN, zh-HK, zh-Hans-CN, zh-Hans-SG, zh-Hant-HK, " +
|
||||
"zh-Hant-TW, zh-SG, zh-TW, ").split(",\\s*");
|
||||
static final String[] lnpLocs = ("ar, be, bg, ca, cs, da, de, el, el-CY, " +
|
||||
"en, en-MT, en-PH, en-SG, es, es-US, et, fi, fr, ga, he, hi, hr, hu, " +
|
||||
"id, is, it, ja, ko, lt, lv, mk, ms, mt, nb-NO, nl, nn-NO, no, no-NO, pl, pt, pt-BR, " +
|
||||
"id, is, it, ja, ko, lt, lv, mk, ms, mt, nb, nb-NO, nl, nn-NO, no, no-NO, pl, pt, pt-BR, " +
|
||||
"pt-PT, ro, ru, sk, sl, sq, sr, sr-Latn, sv, th, tr, uk, und, vi, zh, " +
|
||||
"zh-HK, zh-Hans-SG, zh-Hant-HK, zh-Hant-TW, zh-SG, zh-TW, ").split(",\\s*");
|
||||
static final String[] tznpLocs = ("de, en, en-CA, en-GB, en-IE, es, fr, hi, " +
|
||||
"it, ja, ko, nb-NO, nn-NO, pt-BR, sv, und, zh-CN, zh-HK, zh-Hans-CN, zh-Hant-HK, " +
|
||||
"it, ja, ko, nb, nb-NO, nn-NO, pt-BR, sv, und, zh-CN, zh-HK, zh-Hans-CN, zh-Hant-HK, " +
|
||||
"zh-Hant-TW, zh-TW, ").split(",\\s*");
|
||||
static final String[] caldpLocs = ("ar, be, bg, ca, cs, da, de, el, el-CY, " +
|
||||
"en, en-GB, en-IE, en-MT, es, es-ES, es-US, et, fi, fr, fr-CA, he, hi, " +
|
||||
"hr, hu, id-ID, is, it, ja, ko, lt, lv, mk, ms-MY, mt, mt-MT, nb-NO, nl, nn-NO, no, " +
|
||||
"hr, hu, id-ID, is, it, ja, ko, lt, lv, mk, ms-MY, mt, mt-MT, nb, nb-NO, nl, nn-NO, no, " +
|
||||
"pl, pt, pt-BR, pt-PT, ro, ru, sk, sl, sq, sr, sr-Latn-BA, sr-Latn-ME, " +
|
||||
"sr-Latn-RS, sv, th, tr, uk, und, vi, zh, ").split(",\\s*");
|
||||
static final String[] calpLocs = caldpLocs;
|
||||
|
@ -36,22 +36,42 @@
|
||||
|
||||
import jdk.test.lib.process.OutputAnalyzer;
|
||||
import jdk.testlibrary.FileUtils;
|
||||
import org.testng.annotations.AfterMethod;
|
||||
import org.testng.annotations.BeforeMethod;
|
||||
import org.testng.annotations.DataProvider;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.Method;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
public class ApiValidatorTest extends MRTestBase {
|
||||
|
||||
static final Pattern MODULE_PATTERN = Pattern.compile("module (\\w+)");
|
||||
static final Pattern CLASS_PATTERN = Pattern.compile("package (\\w+).*public class (\\w+)");
|
||||
|
||||
private Path root;
|
||||
private Path classes;
|
||||
|
||||
@BeforeMethod
|
||||
void testInit(Method method) {
|
||||
root = Paths.get(method.getName());
|
||||
classes = root.resolve("classes");
|
||||
}
|
||||
|
||||
@AfterMethod
|
||||
void testCleanup() throws IOException {
|
||||
FileUtils.deleteFileTreeWithRetry(root);
|
||||
}
|
||||
|
||||
|
||||
@Test(dataProvider = "signatureChange")
|
||||
public void changeMethodSignature(String sigBase, String sigV10,
|
||||
boolean isAcceptable,
|
||||
Method method) throws Throwable {
|
||||
Path root = Paths.get(method.getName());
|
||||
Path classes = root.resolve("classes");
|
||||
boolean isAcceptable) throws Throwable {
|
||||
|
||||
String METHOD_SIG = "#SIG";
|
||||
String classTemplate =
|
||||
@ -76,8 +96,6 @@ public class ApiValidatorTest extends MRTestBase {
|
||||
result.shouldNotHaveExitValue(SUCCESS)
|
||||
.shouldContain("contains a class with different api from earlier version");
|
||||
}
|
||||
|
||||
FileUtils.deleteFileTreeWithRetry(root);
|
||||
}
|
||||
|
||||
@DataProvider
|
||||
@ -100,11 +118,7 @@ public class ApiValidatorTest extends MRTestBase {
|
||||
}
|
||||
|
||||
@Test(dataProvider = "publicAPI")
|
||||
public void introducingPublicMembers(String publicAPI,
|
||||
Method method) throws Throwable {
|
||||
Path root = Paths.get(method.getName());
|
||||
Path classes = root.resolve("classes");
|
||||
|
||||
public void introducingPublicMembers(String publicAPI) throws Throwable {
|
||||
String API = "#API";
|
||||
String classTemplate =
|
||||
"public class C { \n" +
|
||||
@ -122,8 +136,6 @@ public class ApiValidatorTest extends MRTestBase {
|
||||
"--release", "10", "-C", classes.resolve("v10").toString(), ".")
|
||||
.shouldNotHaveExitValue(SUCCESS)
|
||||
.shouldContain("contains a class with different api from earlier version");
|
||||
|
||||
FileUtils.deleteFileTreeWithRetry(root);
|
||||
}
|
||||
|
||||
@DataProvider
|
||||
@ -138,11 +150,7 @@ public class ApiValidatorTest extends MRTestBase {
|
||||
}
|
||||
|
||||
@Test(dataProvider = "privateAPI")
|
||||
public void introducingPrivateMembers(String privateAPI,
|
||||
Method method) throws Throwable {
|
||||
Path root = Paths.get(method.getName());
|
||||
Path classes = root.resolve("classes");
|
||||
|
||||
public void introducingPrivateMembers(String privateAPI) throws Throwable {
|
||||
String API = "#API";
|
||||
String classTemplate =
|
||||
"public class C { \n" +
|
||||
@ -167,8 +175,6 @@ public class ApiValidatorTest extends MRTestBase {
|
||||
jar("uf", jarfile,
|
||||
"--release", "11", "-C", classes.resolve("v10").toString(), ".")
|
||||
.shouldHaveExitValue(SUCCESS);
|
||||
|
||||
FileUtils.deleteFileTreeWithRetry(root);
|
||||
}
|
||||
|
||||
@DataProvider
|
||||
@ -190,4 +196,229 @@ public class ApiValidatorTest extends MRTestBase {
|
||||
Files.write(classSourceFile, template.getBytes());
|
||||
javac(classes, classSourceFile);
|
||||
}
|
||||
|
||||
/* Modular multi-release checks */
|
||||
|
||||
@Test
|
||||
public void moduleNameHasChanged() throws Throwable {
|
||||
|
||||
compileModule(classes.resolve("base"), "module A { }");
|
||||
compileModule(classes.resolve("v10"), "module B { }");
|
||||
|
||||
String jarfile = root.resolve("test.jar").toString();
|
||||
jar("cf", jarfile, "-C", classes.resolve("base").toString(), ".",
|
||||
"--release", "10", "-C", classes.resolve("v10").toString(), ".")
|
||||
.shouldNotHaveExitValue(SUCCESS)
|
||||
.shouldContain("incorrect name");
|
||||
|
||||
// update module-info release
|
||||
jar("cf", jarfile, "-C", classes.resolve("base").toString(), ".",
|
||||
"--release", "10", "-C", classes.resolve("base").toString(), ".")
|
||||
.shouldHaveExitValue(SUCCESS);
|
||||
jar("uf", jarfile,
|
||||
"--release", "10", "-C", classes.resolve("v10").toString(), ".")
|
||||
.shouldNotHaveExitValue(SUCCESS)
|
||||
.shouldContain("incorrect name");
|
||||
}
|
||||
|
||||
// @Test @ignore 8173370
|
||||
public void moduleBecomeOpen() throws Throwable {
|
||||
|
||||
compileModule(classes.resolve("base"), "module A { }");
|
||||
compileModule(classes.resolve("v10"), "open module A { }");
|
||||
|
||||
String jarfile = root.resolve("test.jar").toString();
|
||||
jar("cf", jarfile, "-C", classes.resolve("base").toString(), ".",
|
||||
"--release", "10", "-C", classes.resolve("v10").toString(), ".")
|
||||
.shouldNotHaveExitValue(SUCCESS)
|
||||
.shouldContain("FIX ME");
|
||||
|
||||
// update module-info release
|
||||
jar("cf", jarfile, "-C", classes.resolve("base").toString(), ".",
|
||||
"--release", "10", "-C", classes.resolve("base").toString(), ".")
|
||||
.shouldHaveExitValue(SUCCESS);
|
||||
jar("uf", jarfile,
|
||||
"--release", "10", "-C", classes.resolve("v10").toString(), ".")
|
||||
.shouldNotHaveExitValue(SUCCESS)
|
||||
.shouldContain("FIX ME");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void moduleRequires() throws Throwable {
|
||||
|
||||
String BASE_VERSION_DIRECTIVE = "requires jdk.compiler;";
|
||||
// add transitive flag
|
||||
moduleDirectivesCase(BASE_VERSION_DIRECTIVE,
|
||||
"requires transitive jdk.compiler;",
|
||||
false,
|
||||
"contains additional \"requires transitive\"");
|
||||
// remove requires
|
||||
moduleDirectivesCase(BASE_VERSION_DIRECTIVE,
|
||||
"",
|
||||
true,
|
||||
"");
|
||||
// add requires
|
||||
moduleDirectivesCase(BASE_VERSION_DIRECTIVE,
|
||||
"requires jdk.compiler; requires jdk.jartool;",
|
||||
true,
|
||||
"");
|
||||
// add requires transitive
|
||||
moduleDirectivesCase(BASE_VERSION_DIRECTIVE,
|
||||
"requires jdk.compiler; requires transitive jdk.jartool;",
|
||||
false,
|
||||
"contains additional \"requires transitive\"");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void moduleExports() throws Throwable {
|
||||
|
||||
String BASE_VERSION_DIRECTIVE = "exports pkg1; exports pkg2 to jdk.compiler;";
|
||||
// add export
|
||||
moduleDirectivesCase(BASE_VERSION_DIRECTIVE,
|
||||
BASE_VERSION_DIRECTIVE + " exports pkg3;",
|
||||
false,
|
||||
"contains different \"exports\"");
|
||||
// change exports to qualified exports
|
||||
moduleDirectivesCase(BASE_VERSION_DIRECTIVE,
|
||||
"exports pkg1 to jdk.compiler; exports pkg2;",
|
||||
false,
|
||||
"contains different \"exports\"");
|
||||
// remove exports
|
||||
moduleDirectivesCase(BASE_VERSION_DIRECTIVE,
|
||||
"exports pkg1;",
|
||||
false,
|
||||
"contains different \"exports\"");
|
||||
// add qualified exports
|
||||
moduleDirectivesCase(BASE_VERSION_DIRECTIVE,
|
||||
BASE_VERSION_DIRECTIVE + " exports pkg3 to jdk.compiler;",
|
||||
false,
|
||||
"contains different \"exports\"");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void moduleOpens() throws Throwable {
|
||||
|
||||
String BASE_VERSION_DIRECTIVE = "opens pkg1; opens pkg2 to jdk.compiler;";
|
||||
// add opens
|
||||
moduleDirectivesCase(BASE_VERSION_DIRECTIVE,
|
||||
BASE_VERSION_DIRECTIVE + " opens pkg3;",
|
||||
false,
|
||||
"contains different \"opens\"");
|
||||
// change opens to qualified opens
|
||||
moduleDirectivesCase(BASE_VERSION_DIRECTIVE,
|
||||
"opens pkg1 to jdk.compiler; opens pkg2;",
|
||||
false,
|
||||
"contains different \"opens\"");
|
||||
// remove opens
|
||||
moduleDirectivesCase(BASE_VERSION_DIRECTIVE,
|
||||
"opens pkg1;",
|
||||
false,
|
||||
"contains different \"opens\"");
|
||||
// add qualified opens
|
||||
moduleDirectivesCase(BASE_VERSION_DIRECTIVE,
|
||||
BASE_VERSION_DIRECTIVE + " opens pkg3 to jdk.compiler;",
|
||||
false,
|
||||
"contains different \"opens\"");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void moduleProvides() throws Throwable {
|
||||
|
||||
String BASE_VERSION_DIRECTIVE = "provides pkg1.A with pkg1.A;";
|
||||
// add provides
|
||||
moduleDirectivesCase(BASE_VERSION_DIRECTIVE,
|
||||
BASE_VERSION_DIRECTIVE + " provides pkg2.B with pkg2.B;",
|
||||
false,
|
||||
"contains different \"provides\"");
|
||||
// change service impl
|
||||
moduleDirectivesCase(BASE_VERSION_DIRECTIVE,
|
||||
"provides pkg1.A with pkg2.B;",
|
||||
false,
|
||||
"contains different \"provides\"");
|
||||
// remove provides
|
||||
moduleDirectivesCase(BASE_VERSION_DIRECTIVE,
|
||||
"",
|
||||
false,
|
||||
"contains different \"provides\"");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void moduleUses() throws Throwable {
|
||||
|
||||
String BASE_VERSION_DIRECTIVE = "uses pkg1.A;";
|
||||
// add
|
||||
moduleDirectivesCase(BASE_VERSION_DIRECTIVE,
|
||||
BASE_VERSION_DIRECTIVE + " uses pkg2.B;",
|
||||
true,
|
||||
"");
|
||||
// replace
|
||||
moduleDirectivesCase(BASE_VERSION_DIRECTIVE,
|
||||
"uses pkg2.B;",
|
||||
true,
|
||||
"");
|
||||
// remove
|
||||
moduleDirectivesCase(BASE_VERSION_DIRECTIVE,
|
||||
"",
|
||||
true,
|
||||
"");
|
||||
}
|
||||
|
||||
private void moduleDirectivesCase(String baseDirectives,
|
||||
String versionedDirectives,
|
||||
boolean expectSuccess,
|
||||
String expectedMessage) throws Throwable {
|
||||
String[] moduleClasses = {
|
||||
"package pkg1; public class A { }",
|
||||
"package pkg2; public class B extends pkg1.A { }",
|
||||
"package pkg3; public class C extends pkg2.B { }"};
|
||||
compileModule(classes.resolve("base"),
|
||||
"module A { " + baseDirectives + " }",
|
||||
moduleClasses);
|
||||
compileModule(classes.resolve("v10"),
|
||||
"module A { " + versionedDirectives + " }",
|
||||
moduleClasses);
|
||||
|
||||
String jarfile = root.resolve("test.jar").toString();
|
||||
OutputAnalyzer output = jar("cf", jarfile,
|
||||
"-C", classes.resolve("base").toString(), ".",
|
||||
"--release", "10", "-C", classes.resolve("v10").toString(), ".");
|
||||
if (expectSuccess) {
|
||||
output.shouldHaveExitValue(SUCCESS);
|
||||
} else {
|
||||
output.shouldNotHaveExitValue(SUCCESS)
|
||||
.shouldContain(expectedMessage);
|
||||
}
|
||||
}
|
||||
|
||||
private void compileModule(Path classes, String moduleSource,
|
||||
String... classSources) throws Throwable {
|
||||
Matcher moduleMatcher = MODULE_PATTERN.matcher(moduleSource);
|
||||
moduleMatcher.find();
|
||||
String name = moduleMatcher.group(1);
|
||||
Path moduleinfo = Files.createDirectories(
|
||||
classes.getParent().resolve("src").resolve(name))
|
||||
.resolve("module-info.java");
|
||||
Files.write(moduleinfo, moduleSource.getBytes());
|
||||
|
||||
Path[] sourceFiles = new Path[classSources.length + 1];
|
||||
sourceFiles[0] = moduleinfo;
|
||||
|
||||
for (int i = 0; i < classSources.length; i++) {
|
||||
String classSource = classSources[i];
|
||||
Matcher classMatcher = CLASS_PATTERN.matcher(classSource);
|
||||
classMatcher.find();
|
||||
String packageName = classMatcher.group(1);
|
||||
String className = classMatcher.group(2);
|
||||
|
||||
Path packagePath = moduleinfo.getParent()
|
||||
.resolve(packageName.replace('.', '/'));
|
||||
Path sourceFile = Files.createDirectories(packagePath)
|
||||
.resolve(className + ".java");
|
||||
Files.write(sourceFile, classSource.getBytes());
|
||||
|
||||
sourceFiles[i + 1] = sourceFile;
|
||||
}
|
||||
|
||||
javac(classes, sourceFiles);
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user