/* * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.image.BufferedImage; import java.io.IOException; /** * @test * @bug 8015070 * @summary Tests for artifacts around the edges of anti-aliased text. */ public class AADrawStringArtifact { /* Image dimensions */ static final int TEST_IMAGE_WIDTH = 200; static final int TEST_IMAGE_HEIGHT = 100; public AADrawStringArtifact() throws IOException { /* Create a Graphics2D object from a BufferedImage */ BufferedImage testImg = new BufferedImage(TEST_IMAGE_WIDTH, TEST_IMAGE_HEIGHT, BufferedImage.TYPE_INT_ARGB); Graphics2D graphics = (Graphics2D) testImg.getGraphics(); /* Fill the image with translucent color */ graphics.setColor(new Color(127, 127, 127, 127)); graphics.fillRect(0, 0, TEST_IMAGE_WIDTH, TEST_IMAGE_HEIGHT); /* Drawstring with Antialiasing hint */ graphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); Font font = new Font("Verdana" , Font.PLAIN, 60); graphics.setFont(font); graphics.setColor(new Color(255, 0, 0)); graphics.drawString("Save", 30, 65); graphics.dispose(); /* Check for artifacts */ checkArtifacts(testImg); } void checkArtifacts(BufferedImage testImage) throws IOException { int componentMask = 0xff; int colorThreshold = 200; int rowIndex = 0; int colIndex = 0; /* Loop through every pixel to check for possible artifact */ for (rowIndex = 0; rowIndex < testImage.getHeight(); rowIndex++) { for (colIndex = 0; colIndex < testImage.getWidth(); colIndex++) { /* * API: getRGB(x,y) returns color in INT_ARGB color space. * Extract individual color components with a simple mask. */ int colorValue = testImage.getRGB(colIndex, rowIndex); int colorComponent1 = colorValue & componentMask; int colorComponent2 = (colorValue>>8) & componentMask; int colorComponent3 = (colorValue>>16) & componentMask; /* * Artifacts are predominantly a subjective decision based on * the quality of the rendered image content. However, in the * current use-case, the artifacts around the edges of the anti * aliased text appear like spots of white pixels without any * relation to the color of foreground text or the background * translucent shape. * * To identify the artifact pixels, each color component from * the testImage is compared with a constant threshold. The * component threshold has been set based on observation from * different experiments on mulitple Java versions. */ if (colorComponent1 >= colorThreshold && colorComponent2 >= colorThreshold && colorComponent3 >= colorThreshold) { /* Artifact has been noticed. Report error. */ throw new RuntimeException("Test Failed."); } } } } public static void main(String[] args) throws IOException { /* Mere instantiating this object will suffice for automated test */ AADrawStringArtifact artifactTest = new AADrawStringArtifact(); } }