--- old/src/java.desktop/share/classes/com/sun/imageio/plugins/png/PNGMetadata.java 2018-04-18 14:57:17.631886000 +0530 +++ new/src/java.desktop/share/classes/com/sun/imageio/plugins/png/PNGMetadata.java 2018-04-18 14:57:17.119886000 +0530 @@ -1882,6 +1882,7 @@ bKGD_colorType = PNGImageReader.PNG_COLOR_GRAY; bKGD_gray = red; } else { + bKGD_colorType = PNGImageReader.PNG_COLOR_RGB; bKGD_red = red; bKGD_green = green; bKGD_blue = blue; --- old/test/jdk/javax/imageio/plugins/png/VerifyRGBValuesFromBKGDChunk.java 2018-04-18 14:57:18.759886000 +0530 +++ new/test/jdk/javax/imageio/plugins/png/VerifyRGBValuesFromBKGDChunk.java 2018-04-18 14:57:18.351886000 +0530 @@ -23,7 +23,7 @@ /* * @test - * @bug 6574555 + * @bug 6574555 5109146 * @summary Test verifies that PNGImageWriter encodes the R, G, B * values of bKGD chunk properly. * @run main VerifyRGBValuesFromBKGDChunk @@ -37,6 +37,7 @@ import javax.imageio.ImageReader; import javax.imageio.ImageIO; import javax.imageio.ImageWriteParam; +import javax.imageio.metadata.IIOInvalidTreeException; import javax.imageio.metadata.IIOMetadata; import javax.imageio.metadata.IIOMetadataNode; import javax.imageio.IIOImage; @@ -48,30 +49,37 @@ public class VerifyRGBValuesFromBKGDChunk { - public static void main(String[] args) throws IOException { - int width = 1; - int height = 1; - BufferedImage img = new - BufferedImage(width, height, BufferedImage.TYPE_INT_BGR); - Iterator iterWriter = - ImageIO.getImageWritersBySuffix("png"); - ImageWriter writer = iterWriter.next(); + private static IIOMetadata encodeMetadata; + private static ImageWriter writer; + private static BufferedImage img; + private static ImageWriteParam param; + private static boolean nativeBKGDFail, standardBKGDFail; + private static IIOMetadataNode bKGD_RGBNode; + private static final String BKGDRED = "100"; + private static final String BKGDGREEN = "150"; + private static final String BKGDBLUE = "200"; + + private static void mergeStandardMetadata() throws IIOInvalidTreeException { + IIOMetadataNode background_rgb = new IIOMetadataNode("BackgroundColor"); + + background_rgb.setAttribute("red", BKGDRED); + background_rgb.setAttribute("green", BKGDGREEN); + background_rgb.setAttribute("blue", BKGDBLUE); + + IIOMetadataNode chroma = new IIOMetadataNode("Chroma"); + chroma.appendChild(background_rgb); + IIOMetadataNode encodeRoot = new IIOMetadataNode("javax_imageio_1.0"); + encodeRoot.appendChild(chroma); - ImageWriteParam param = writer.getDefaultWriteParam(); - ImageTypeSpecifier specifier = - ImageTypeSpecifier. - createFromBufferedImageType(BufferedImage.TYPE_INT_BGR); - IIOMetadata encodeMetadata = - writer.getDefaultImageMetadata(specifier, param); + encodeMetadata.mergeTree("javax_imageio_1.0", encodeRoot); + } - // Write png image with bKGD chunk + private static void mergeNativeMetadata() throws IIOInvalidTreeException { IIOMetadataNode bKGD_rgb = new IIOMetadataNode("bKGD_RGB"); - String red = "100"; - String green = "150"; - String blue = "200"; - bKGD_rgb.setAttribute("red", red); - bKGD_rgb.setAttribute("green", green); - bKGD_rgb.setAttribute("blue", blue); + + bKGD_rgb.setAttribute("red", BKGDRED); + bKGD_rgb.setAttribute("green", BKGDGREEN); + bKGD_rgb.setAttribute("blue", BKGDBLUE); IIOMetadataNode bKGD = new IIOMetadataNode("bKGD"); bKGD.appendChild(bKGD_rgb); @@ -80,7 +88,9 @@ encodeRoot.appendChild(bKGD); encodeMetadata.mergeTree("javax_imageio_png_1.0", encodeRoot); + } + private static void writeAndReadMetadata() throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ImageOutputStream ios = ImageIO.createImageOutputStream(baos); writer.setOutput(ios); @@ -105,15 +115,56 @@ IIOMetadataNode decodeRoot = (IIOMetadataNode) decodeMetadata. getAsTree("javax_imageio_png_1.0"); - bKGD_rgb = (IIOMetadataNode) + bKGD_RGBNode = (IIOMetadataNode) decodeRoot.getElementsByTagName("bKGD_RGB").item(0); reader.dispose(); + } + + private static boolean verifyRGBValues() { + return (!(BKGDRED.equals(bKGD_RGBNode.getAttribute("red")) && + BKGDGREEN.equals(bKGD_RGBNode.getAttribute("green")) && + BKGDBLUE.equals(bKGD_RGBNode.getAttribute("blue")))); + } + + private static void VerifyNativeRGBValuesFromBKGDChunk() + throws IOException { + + mergeNativeMetadata(); + writeAndReadMetadata(); + nativeBKGDFail = verifyRGBValues(); + } + + private static void VerifyStandardRGBValuesFromBKGDChunk() + throws IOException { + + mergeStandardMetadata(); + writeAndReadMetadata(); + standardBKGDFail = verifyRGBValues(); + } + + public static void main(String[] args) throws IOException { + int width = 1; + int height = 1; + img = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR); + Iterator iterWriter = + ImageIO.getImageWritersBySuffix("png"); + writer = iterWriter.next(); + + param = writer.getDefaultWriteParam(); + ImageTypeSpecifier specifier = + ImageTypeSpecifier. + createFromBufferedImageType(BufferedImage.TYPE_INT_BGR); + encodeMetadata = writer.getDefaultImageMetadata(specifier, param); + + // Verify bKGD RGB values after merging metadata using native tree + VerifyNativeRGBValuesFromBKGDChunk(); + + // Verify bKGD RGB values after merging metadata using standard tree + VerifyStandardRGBValuesFromBKGDChunk(); - if (!(red.equals(bKGD_rgb.getAttribute("red")) && - green.equals(bKGD_rgb.getAttribute("green")) && - blue.equals(bKGD_rgb.getAttribute("blue")))) { + if (nativeBKGDFail || standardBKGDFail) { throw new RuntimeException("bKGD RGB values are not stored" + - " properly"); + " properly"); } } }