1 /* 2 * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 /* 25 * @test 26 * @bug 8177393 27 * @summary Verify RescaleOp applied to BufferedImages. 28 * @run main ImageRescaleOpTest 29 */ 30 31 import java.awt.Graphics2D; 32 import java.awt.image.BufferedImage; 33 import static java.awt.image.BufferedImage.*; 34 import java.awt.image.RescaleOp; 35 import java.awt.Color; 36 import java.io.File; 37 import java.io.IOException; 38 import javax.imageio.ImageIO; 39 40 public class ImageRescaleOpTest { 41 42 int w = 10, h = 10; 43 float scaleFactor = 0.5f; 44 float offset = 0.0f; 45 static boolean saveImage = false; 46 47 public static void main(String[] args) throws Exception { 48 saveImage = args.length > 0; 49 ImageRescaleOpTest test = new ImageRescaleOpTest(); 50 test.startTest(); 51 } 52 53 String getFileName(int s, int d) { 54 return textFor(s)+"_to_"+textFor(d)+".png"; 55 } 56 57 String getMsgText(int s, int d) { 58 return textFor(s)+"->"+textFor(d)+": "; 59 } 60 61 String textFor(int t) { 62 switch (t) { 63 case TYPE_INT_ARGB : return "ARGB"; 64 case TYPE_INT_RGB : return "RGB"; 65 case TYPE_4BYTE_ABGR : return "4BYTEABGR"; 66 case TYPE_3BYTE_BGR : return "3BYTEBGR"; 67 case TYPE_USHORT_555_RGB : return "USHORT_555_RGB"; 68 case TYPE_USHORT_565_RGB : return "USHORT_565_RGB"; 69 case TYPE_USHORT_GRAY : return "USHORT_GRAY"; 70 default : return "OTHER"; 71 } 72 } 73 74 private void startTest() throws Exception { 75 76 int expect = 0xff7f7f7f; 77 runTest(TYPE_INT_RGB, TYPE_INT_RGB, expect); 78 runTest(TYPE_INT_ARGB, TYPE_INT_ARGB, expect); 79 runTest(TYPE_INT_ARGB, TYPE_INT_RGB, expect); 80 runTest(TYPE_INT_RGB, TYPE_INT_ARGB, expect); 81 82 runTest(TYPE_3BYTE_BGR, TYPE_3BYTE_BGR, expect); 83 runTest(TYPE_3BYTE_BGR, TYPE_4BYTE_ABGR, expect); 84 runTest(TYPE_4BYTE_ABGR, TYPE_3BYTE_BGR, expect); 85 runTest(TYPE_4BYTE_ABGR, TYPE_4BYTE_ABGR, expect); 86 87 /* Slightly different values here due to limited precision */ 88 runTest(TYPE_USHORT_555_RGB, TYPE_USHORT_555_RGB, 0xff7b7b7b); 89 runTest(TYPE_USHORT_565_RGB, TYPE_USHORT_565_RGB, 0xff7b7d7b); 90 91 /* 565->555 and 555->565 results are wrong as the slow code 92 * path used is not accounting for the difference in the range. 93 */ 94 //runTest(TYPE_USHORT_555_RGB, TYPE_USHORT_565_RGB, expect); 95 //runTest(TYPE_USHORT_565_RGB, TYPE_USHORT_555_RGB, expect); 96 97 runTest(TYPE_USHORT_GRAY, TYPE_USHORT_GRAY, 0xffbcbcbc); 98 99 } 100 101 private void check(BufferedImage bi, int expect, String msg) { 102 int argb = bi.getRGB(w-1, h-1); 103 System.out.println(msg + Integer.toHexString(argb)); 104 if (argb != expect) { 105 throw new RuntimeException(msg + 106 " expected " + Integer.toHexString(expect) + 107 " but got " + Integer.toHexString(argb)); 108 } 109 } 110 111 private void runTest(int sType, int dType, int expect) { 112 113 BufferedImage src = new BufferedImage(w, h, sType); 114 BufferedImage dst = new BufferedImage(w, h, dType); 115 String msg = getMsgText(sType, dType); 116 117 Graphics2D g2d = src.createGraphics(); 118 g2d.setColor(Color.WHITE); 119 g2d.fillRect(0, 0, w, h); 120 RescaleOp res = new RescaleOp(scaleFactor, offset, null); 121 res.filter(src, dst); 122 if (saveImage) { 123 try { 124 String fname = getFileName(sType, dType); 125 ImageIO.write(dst, "png", new File(fname)); 126 } catch (IOException e) { 127 } 128 } 129 check(dst, expect, msg); 130 } 131 }