1 /*
   2  * Copyright (c) 2007, 2016, 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  * @key headful
  27  * @bug 6603887
  28  * @summary Verifies that drawImage with bg color works correctly for ICM image
  29  * @run main/othervm DrawImageBgTest
  30  * @run main/othervm -Dsun.java2d.pmoffscreen=true DrawImageBgTest
  31  */
  32 import java.awt.Color;
  33 import java.awt.Graphics;
  34 import java.awt.GraphicsConfiguration;
  35 import java.awt.GraphicsEnvironment;
  36 import java.awt.image.BufferedImage;
  37 import java.awt.image.IndexColorModel;
  38 import java.awt.image.VolatileImage;
  39 import java.awt.image.WritableRaster;
  40 import java.io.File;
  41 import java.io.IOException;
  42 import javax.imageio.ImageIO;
  43 
  44 public class DrawImageBgTest {
  45     public static void main(String[] args) {
  46         GraphicsConfiguration gc =
  47             GraphicsEnvironment.getLocalGraphicsEnvironment().
  48                 getDefaultScreenDevice().getDefaultConfiguration();
  49 
  50         if (gc.getColorModel().getPixelSize() <= 8) {
  51             System.out.println("8-bit color model, test considered passed");
  52             return;
  53         }
  54 
  55         /*
  56          * Set up images:
  57          * 1.) VolatileImge for rendering to,
  58          * 2.) BufferedImage for reading back the contents of the VI
  59          * 3.) The image triggering the problem
  60          */
  61         VolatileImage vImg = null;
  62         BufferedImage readBackBImg;
  63 
  64         // create a BITMASK ICM such that the transparent color is
  65         // tr. black (and it's the first in the color map so a buffered image
  66         // created with this ICM is transparent
  67         byte r[] = { 0x00, (byte)0xff};
  68         byte g[] = { 0x00, (byte)0xff};
  69         byte b[] = { 0x00, (byte)0xff};
  70         IndexColorModel icm = new IndexColorModel(8, 2, r, g, b, 0);
  71         WritableRaster wr = icm.createCompatibleWritableRaster(25, 25);
  72         BufferedImage tImg = new BufferedImage(icm, wr, false, null);
  73 
  74         do {
  75             if (vImg == null ||
  76                 vImg.validate(gc) == VolatileImage.IMAGE_INCOMPATIBLE)
  77             {
  78                 vImg = gc.createCompatibleVolatileImage(tImg.getWidth(),
  79                                                         tImg.getHeight());
  80             }
  81 
  82             Graphics viG = vImg.getGraphics();
  83             viG.setColor(Color.red);
  84             viG.fillRect(0, 0, vImg.getWidth(), vImg.getHeight());
  85 
  86             viG.drawImage(tImg, 0, 0, Color.green, null);
  87             viG.fillRect(0, 0, vImg.getWidth(), vImg.getHeight());
  88             viG.drawImage(tImg, 0, 0, Color.white, null);
  89 
  90             readBackBImg = vImg.getSnapshot();
  91         } while (vImg.contentsLost());
  92 
  93         for (int x = 0; x < readBackBImg.getWidth(); x++) {
  94             for (int y = 0; y < readBackBImg.getHeight(); y++) {
  95                 int currPixel = readBackBImg.getRGB(x, y);
  96                 if (currPixel != Color.white.getRGB()) {
  97                     String fileName = "DrawImageBgTest.png";
  98                     try {
  99                         ImageIO.write(readBackBImg, "png", new File(fileName));
 100                         System.err.println("Dumped image to " + fileName);
 101                     } catch (IOException ex) {}
 102                     throw new
 103                         RuntimeException("Test Failed: found wrong color: 0x"+
 104                                          Integer.toHexString(currPixel));
 105                 }
 106             }
 107         }
 108         System.out.println("Test Passed.");
 109     }
 110 }