jdk/src/share/classes/javax/swing/plaf/nimbus/EffectUtils.java
author rupashka
Sat, 28 May 2011 11:55:32 +0400
changeset 9769 7af3ada3cf8e
parent 5506 202f599c92aa
permissions -rw-r--r--
7048204: NPE from NimbusLookAndFeel.addDefault Reviewed-by: peterz
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
     1
/*
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2658
diff changeset
     2
 * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved.
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
     4
 *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2658
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2658
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    10
 *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    15
 * accompanied this code).
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    16
 *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    20
 *
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2658
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2658
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2658
diff changeset
    23
 * questions.
2658
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    24
 */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    25
package javax.swing.plaf.nimbus;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    26
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    27
import java.awt.AlphaComposite;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    28
import java.awt.Graphics2D;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    29
import java.awt.Transparency;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    30
import java.awt.GraphicsConfiguration;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    31
import java.awt.GraphicsEnvironment;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    32
import java.awt.image.BufferedImage;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    33
import java.awt.image.Raster;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    34
import java.awt.image.WritableRaster;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    35
import java.awt.image.ColorModel;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    36
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    37
/**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    38
 * EffectUtils
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    39
 *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    40
 * @author Created by Jasper Potts (Jun 18, 2007)
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    41
 */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    42
class EffectUtils {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    43
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    44
    /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    45
     * Clear a transparent image to 100% transparent
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    46
     *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    47
     * @param img The image to clear
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    48
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    49
    static void clearImage(BufferedImage img) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    50
        Graphics2D g2 = img.createGraphics();
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    51
        g2.setComposite(AlphaComposite.Clear);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    52
        g2.fillRect(0, 0, img.getWidth(), img.getHeight());
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    53
        g2.dispose();
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    54
    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    55
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    56
    // =================================================================================================================
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    57
    // Blur
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    58
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    59
    /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    60
     * Apply Gaussian Blur to Image
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    61
     *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    62
     * @param src    The image tp
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    63
     * @param dst    The destination image to draw blured src image into, null if you want a new one created
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    64
     * @param radius The blur kernel radius
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    65
     * @return The blured image
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    66
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    67
    static BufferedImage gaussianBlur(BufferedImage src, BufferedImage dst, int radius) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    68
        int width = src.getWidth();
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    69
        int height = src.getHeight();
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    70
        if (dst == null || dst.getWidth() != width || dst.getHeight() != height || src.getType() != dst.getType()) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    71
            dst = createColorModelCompatibleImage(src);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    72
        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    73
        float[] kernel = createGaussianKernel(radius);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    74
        if (src.getType() == BufferedImage.TYPE_INT_ARGB) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    75
            int[] srcPixels = new int[width * height];
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    76
            int[] dstPixels = new int[width * height];
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    77
            getPixels(src, 0, 0, width, height, srcPixels);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    78
            // horizontal pass
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    79
            blur(srcPixels, dstPixels, width, height, kernel, radius);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    80
            // vertical pass
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    81
            //noinspection SuspiciousNameCombination
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    82
            blur(dstPixels, srcPixels, height, width, kernel, radius);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    83
            // the result is now stored in srcPixels due to the 2nd pass
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    84
            setPixels(dst, 0, 0, width, height, srcPixels);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    85
        } else if (src.getType() == BufferedImage.TYPE_BYTE_GRAY) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    86
            byte[] srcPixels = new byte[width * height];
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    87
            byte[] dstPixels = new byte[width * height];
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    88
            getPixels(src, 0, 0, width, height, srcPixels);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    89
            // horizontal pass
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    90
            blur(srcPixels, dstPixels, width, height, kernel, radius);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    91
            // vertical pass
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    92
            //noinspection SuspiciousNameCombination
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    93
            blur(dstPixels, srcPixels, height, width, kernel, radius);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    94
            // the result is now stored in srcPixels due to the 2nd pass
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    95
            setPixels(dst, 0, 0, width, height, srcPixels);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    96
        } else {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    97
            throw new IllegalArgumentException("EffectUtils.gaussianBlur() src image is not a supported type, type=[" +
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    98
                    src.getType() + "]");
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
    99
        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   100
        return dst;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   101
    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   102
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   103
    /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   104
     * <p>Blurs the source pixels into the destination pixels. The force of the blur is specified by the radius which
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   105
     * must be greater than 0.</p> <p>The source and destination pixels arrays are expected to be in the INT_ARGB
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   106
     * format.</p> <p>After this method is executed, dstPixels contains a transposed and filtered copy of
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   107
     * srcPixels.</p>
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   108
     *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   109
     * @param srcPixels the source pixels
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   110
     * @param dstPixels the destination pixels
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   111
     * @param width     the width of the source picture
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   112
     * @param height    the height of the source picture
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   113
     * @param kernel    the kernel of the blur effect
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   114
     * @param radius    the radius of the blur effect
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   115
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   116
    private static void blur(int[] srcPixels, int[] dstPixels,
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   117
                             int width, int height,
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   118
                             float[] kernel, int radius) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   119
        float a;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   120
        float r;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   121
        float g;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   122
        float b;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   123
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   124
        int ca;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   125
        int cr;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   126
        int cg;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   127
        int cb;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   128
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   129
        for (int y = 0; y < height; y++) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   130
            int index = y;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   131
            int offset = y * width;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   132
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   133
            for (int x = 0; x < width; x++) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   134
                a = r = g = b = 0.0f;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   135
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   136
                for (int i = -radius; i <= radius; i++) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   137
                    int subOffset = x + i;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   138
                    if (subOffset < 0 || subOffset >= width) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   139
                        subOffset = (x + width) % width;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   140
                    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   141
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   142
                    int pixel = srcPixels[offset + subOffset];
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   143
                    float blurFactor = kernel[radius + i];
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   144
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   145
                    a += blurFactor * ((pixel >> 24) & 0xFF);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   146
                    r += blurFactor * ((pixel >> 16) & 0xFF);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   147
                    g += blurFactor * ((pixel >> 8) & 0xFF);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   148
                    b += blurFactor * ((pixel) & 0xFF);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   149
                }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   150
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   151
                ca = (int) (a + 0.5f);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   152
                cr = (int) (r + 0.5f);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   153
                cg = (int) (g + 0.5f);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   154
                cb = (int) (b + 0.5f);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   155
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   156
                dstPixels[index] = ((ca > 255 ? 255 : ca) << 24) |
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   157
                        ((cr > 255 ? 255 : cr) << 16) |
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   158
                        ((cg > 255 ? 255 : cg) << 8) |
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   159
                        (cb > 255 ? 255 : cb);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   160
                index += height;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   161
            }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   162
        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   163
    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   164
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   165
    /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   166
     * <p>Blurs the source pixels into the destination pixels. The force of the blur is specified by the radius which
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   167
     * must be greater than 0.</p> <p>The source and destination pixels arrays are expected to be in the BYTE_GREY
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   168
     * format.</p> <p>After this method is executed, dstPixels contains a transposed and filtered copy of
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   169
     * srcPixels.</p>
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   170
     *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   171
     * @param srcPixels the source pixels
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   172
     * @param dstPixels the destination pixels
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   173
     * @param width     the width of the source picture
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   174
     * @param height    the height of the source picture
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   175
     * @param kernel    the kernel of the blur effect
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   176
     * @param radius    the radius of the blur effect
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   177
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   178
    static void blur(byte[] srcPixels, byte[] dstPixels,
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   179
                            int width, int height,
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   180
                            float[] kernel, int radius) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   181
        float p;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   182
        int cp;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   183
        for (int y = 0; y < height; y++) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   184
            int index = y;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   185
            int offset = y * width;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   186
            for (int x = 0; x < width; x++) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   187
                p = 0.0f;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   188
                for (int i = -radius; i <= radius; i++) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   189
                    int subOffset = x + i;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   190
//                    if (subOffset < 0) subOffset = 0;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   191
//                    if (subOffset >= width) subOffset = width-1;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   192
                    if (subOffset < 0 || subOffset >= width) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   193
                        subOffset = (x + width) % width;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   194
                    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   195
                    int pixel = srcPixels[offset + subOffset] & 0xFF;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   196
                    float blurFactor = kernel[radius + i];
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   197
                    p += blurFactor * pixel;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   198
                }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   199
                cp = (int) (p + 0.5f);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   200
                dstPixels[index] = (byte) (cp > 255 ? 255 : cp);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   201
                index += height;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   202
            }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   203
        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   204
    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   205
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   206
    static float[] createGaussianKernel(int radius) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   207
        if (radius < 1) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   208
            throw new IllegalArgumentException("Radius must be >= 1");
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   209
        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   210
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   211
        float[] data = new float[radius * 2 + 1];
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   212
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   213
        float sigma = radius / 3.0f;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   214
        float twoSigmaSquare = 2.0f * sigma * sigma;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   215
        float sigmaRoot = (float) Math.sqrt(twoSigmaSquare * Math.PI);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   216
        float total = 0.0f;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   217
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   218
        for (int i = -radius; i <= radius; i++) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   219
            float distance = i * i;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   220
            int index = i + radius;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   221
            data[index] = (float) Math.exp(-distance / twoSigmaSquare) / sigmaRoot;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   222
            total += data[index];
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   223
        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   224
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   225
        for (int i = 0; i < data.length; i++) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   226
            data[i] /= total;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   227
        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   228
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   229
        return data;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   230
    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   231
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   232
    // =================================================================================================================
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   233
    // Get/Set Pixels helper methods
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   234
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   235
    /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   236
     * <p>Returns an array of pixels, stored as integers, from a <code>BufferedImage</code>. The pixels are grabbed from
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   237
     * a rectangular area defined by a location and two dimensions. Calling this method on an image of type different
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   238
     * from <code>BufferedImage.TYPE_INT_ARGB</code> and <code>BufferedImage.TYPE_INT_RGB</code> will unmanage the
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   239
     * image.</p>
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   240
     *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   241
     * @param img    the source image
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   242
     * @param x      the x location at which to start grabbing pixels
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   243
     * @param y      the y location at which to start grabbing pixels
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   244
     * @param w      the width of the rectangle of pixels to grab
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   245
     * @param h      the height of the rectangle of pixels to grab
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   246
     * @param pixels a pre-allocated array of pixels of size w*h; can be null
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   247
     * @return <code>pixels</code> if non-null, a new array of integers otherwise
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   248
     * @throws IllegalArgumentException is <code>pixels</code> is non-null and of length &lt; w*h
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   249
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   250
    static byte[] getPixels(BufferedImage img,
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   251
                                   int x, int y, int w, int h, byte[] pixels) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   252
        if (w == 0 || h == 0) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   253
            return new byte[0];
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   254
        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   255
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   256
        if (pixels == null) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   257
            pixels = new byte[w * h];
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   258
        } else if (pixels.length < w * h) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   259
            throw new IllegalArgumentException("pixels array must have a length >= w*h");
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   260
        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   261
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   262
        int imageType = img.getType();
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   263
        if (imageType == BufferedImage.TYPE_BYTE_GRAY) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   264
            Raster raster = img.getRaster();
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   265
            return (byte[]) raster.getDataElements(x, y, w, h, pixels);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   266
        } else {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   267
            throw new IllegalArgumentException("Only type BYTE_GRAY is supported");
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   268
        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   269
    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   270
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   271
    /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   272
     * <p>Writes a rectangular area of pixels in the destination <code>BufferedImage</code>. Calling this method on an
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   273
     * image of type different from <code>BufferedImage.TYPE_INT_ARGB</code> and <code>BufferedImage.TYPE_INT_RGB</code>
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   274
     * will unmanage the image.</p>
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   275
     *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   276
     * @param img    the destination image
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   277
     * @param x      the x location at which to start storing pixels
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   278
     * @param y      the y location at which to start storing pixels
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   279
     * @param w      the width of the rectangle of pixels to store
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   280
     * @param h      the height of the rectangle of pixels to store
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   281
     * @param pixels an array of pixels, stored as integers
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   282
     * @throws IllegalArgumentException is <code>pixels</code> is non-null and of length &lt; w*h
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   283
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   284
    static void setPixels(BufferedImage img,
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   285
                                 int x, int y, int w, int h, byte[] pixels) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   286
        if (pixels == null || w == 0 || h == 0) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   287
            return;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   288
        } else if (pixels.length < w * h) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   289
            throw new IllegalArgumentException("pixels array must have a length >= w*h");
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   290
        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   291
        int imageType = img.getType();
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   292
        if (imageType == BufferedImage.TYPE_BYTE_GRAY) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   293
            WritableRaster raster = img.getRaster();
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   294
            raster.setDataElements(x, y, w, h, pixels);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   295
        } else {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   296
            throw new IllegalArgumentException("Only type BYTE_GRAY is supported");
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   297
        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   298
    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   299
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   300
    /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   301
     * <p>Returns an array of pixels, stored as integers, from a
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   302
     * <code>BufferedImage</code>. The pixels are grabbed from a rectangular
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   303
     * area defined by a location and two dimensions. Calling this method on
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   304
     * an image of type different from <code>BufferedImage.TYPE_INT_ARGB</code>
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   305
     * and <code>BufferedImage.TYPE_INT_RGB</code> will unmanage the image.</p>
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   306
     *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   307
     * @param img the source image
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   308
     * @param x the x location at which to start grabbing pixels
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   309
     * @param y the y location at which to start grabbing pixels
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   310
     * @param w the width of the rectangle of pixels to grab
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   311
     * @param h the height of the rectangle of pixels to grab
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   312
     * @param pixels a pre-allocated array of pixels of size w*h; can be null
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   313
     * @return <code>pixels</code> if non-null, a new array of integers
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   314
     *   otherwise
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   315
     * @throws IllegalArgumentException is <code>pixels</code> is non-null and
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   316
     *   of length &lt; w*h
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   317
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   318
    public static int[] getPixels(BufferedImage img,
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   319
                                  int x, int y, int w, int h, int[] pixels) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   320
        if (w == 0 || h == 0) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   321
            return new int[0];
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   322
        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   323
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   324
        if (pixels == null) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   325
            pixels = new int[w * h];
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   326
        } else if (pixels.length < w * h) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   327
            throw new IllegalArgumentException("pixels array must have a length" +
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   328
                                               " >= w*h");
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   329
        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   330
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   331
        int imageType = img.getType();
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   332
        if (imageType == BufferedImage.TYPE_INT_ARGB ||
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   333
            imageType == BufferedImage.TYPE_INT_RGB) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   334
            Raster raster = img.getRaster();
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   335
            return (int[]) raster.getDataElements(x, y, w, h, pixels);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   336
        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   337
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   338
        // Unmanages the image
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   339
        return img.getRGB(x, y, w, h, pixels, 0, w);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   340
    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   341
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   342
    /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   343
     * <p>Writes a rectangular area of pixels in the destination
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   344
     * <code>BufferedImage</code>. Calling this method on
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   345
     * an image of type different from <code>BufferedImage.TYPE_INT_ARGB</code>
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   346
     * and <code>BufferedImage.TYPE_INT_RGB</code> will unmanage the image.</p>
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   347
     *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   348
     * @param img the destination image
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   349
     * @param x the x location at which to start storing pixels
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   350
     * @param y the y location at which to start storing pixels
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   351
     * @param w the width of the rectangle of pixels to store
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   352
     * @param h the height of the rectangle of pixels to store
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   353
     * @param pixels an array of pixels, stored as integers
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   354
     * @throws IllegalArgumentException is <code>pixels</code> is non-null and
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   355
     *   of length &lt; w*h
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   356
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   357
    public static void setPixels(BufferedImage img,
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   358
                                 int x, int y, int w, int h, int[] pixels) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   359
        if (pixels == null || w == 0 || h == 0) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   360
            return;
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   361
        } else if (pixels.length < w * h) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   362
            throw new IllegalArgumentException("pixels array must have a length" +
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   363
                                               " >= w*h");
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   364
        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   365
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   366
        int imageType = img.getType();
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   367
        if (imageType == BufferedImage.TYPE_INT_ARGB ||
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   368
            imageType == BufferedImage.TYPE_INT_RGB) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   369
            WritableRaster raster = img.getRaster();
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   370
            raster.setDataElements(x, y, w, h, pixels);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   371
        } else {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   372
            // Unmanages the image
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   373
            img.setRGB(x, y, w, h, pixels, 0, w);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   374
        }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   375
    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   376
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   377
    /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   378
     * <p>Returns a new <code>BufferedImage</code> using the same color model
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   379
     * as the image passed as a parameter. The returned image is only compatible
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   380
     * with the image passed as a parameter. This does not mean the returned
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   381
     * image is compatible with the hardware.</p>
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   382
     *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   383
     * @param image the reference image from which the color model of the new
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   384
     *   image is obtained
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   385
     * @return a new <code>BufferedImage</code>, compatible with the color model
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   386
     *   of <code>image</code>
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   387
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   388
    public static BufferedImage createColorModelCompatibleImage(BufferedImage image) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   389
        ColorModel cm = image.getColorModel();
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   390
        return new BufferedImage(cm,
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   391
            cm.createCompatibleWritableRaster(image.getWidth(),
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   392
                                              image.getHeight()),
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   393
            cm.isAlphaPremultiplied(), null);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   394
    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   395
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   396
    /**
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   397
     * <p>Returns a new translucent compatible image of the specified width and
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   398
     * height. That is, the returned <code>BufferedImage</code> is compatible with
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   399
     * the graphics hardware. If the method is called in a headless
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   400
     * environment, then the returned BufferedImage will be compatible with
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   401
     * the source image.</p>
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   402
     *
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   403
     * @param width the width of the new image
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   404
     * @param height the height of the new image
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   405
     * @return a new translucent compatible <code>BufferedImage</code> of the
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   406
     *   specified width and height
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   407
     */
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   408
    public static BufferedImage createCompatibleTranslucentImage(int width,
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   409
                                                                 int height) {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   410
        return isHeadless() ?
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   411
                new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB) :
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   412
                getGraphicsConfiguration().createCompatibleImage(width, height,
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   413
                                                   Transparency.TRANSLUCENT);
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   414
    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   415
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   416
    private static boolean isHeadless() {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   417
        return GraphicsEnvironment.isHeadless();
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   418
    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   419
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   420
    // Returns the graphics configuration for the primary screen
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   421
    private static GraphicsConfiguration getGraphicsConfiguration() {
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   422
        return GraphicsEnvironment.getLocalGraphicsEnvironment().
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   423
                    getDefaultScreenDevice().getDefaultConfiguration();
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   424
    }
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   425
43e06bc950ec 6591875: Nimbus Swing Look and Feel
peterz
parents:
diff changeset
   426
}