Search in sources :

Example 26 with DataBufferInt

use of java.awt.image.DataBufferInt in project android_frameworks_base by AOSPA.

the class ShadowPainter method createDropShadow.

/**
     * Creates a drop shadow of a given image and returns a new image which shows the input image on
     * top of its drop shadow.
     * <p/>
     * <b>NOTE: If the shape is rectangular and opaque, consider using {@link
     * #drawRectangleShadow(Graphics2D, int, int, int, int)} instead.</b>
     *
     * @param source the source image to be shadowed
     * @param shadowSize the size of the shadow in pixels
     * @param shadowOpacity the opacity of the shadow, with 0=transparent and 1=opaque
     * @param shadowRgb the RGB int to use for the shadow color
     *
     * @return a new image with the source image on top of its shadow when shadowSize > 0 or the
     * source image otherwise
     */
// Imported code
@SuppressWarnings({ "SuspiciousNameCombination", "UnnecessaryLocalVariable" })
public static BufferedImage createDropShadow(BufferedImage source, int shadowSize, float shadowOpacity, int shadowRgb) {
    if (shadowSize <= 0) {
        return source;
    }
    // This code is based on
    //      http://www.jroller.com/gfx/entry/non_rectangular_shadow
    BufferedImage image;
    int width = source.getWidth();
    int height = source.getHeight();
    image = new BufferedImage(width + SHADOW_SIZE, height + SHADOW_SIZE, BufferedImage.TYPE_INT_ARGB);
    Graphics2D g2 = image.createGraphics();
    g2.drawImage(image, shadowSize, shadowSize, null);
    int dstWidth = image.getWidth();
    int dstHeight = image.getHeight();
    int left = (shadowSize - 1) >> 1;
    int right = shadowSize - left;
    int xStart = left;
    int xStop = dstWidth - right;
    int yStart = left;
    int yStop = dstHeight - right;
    shadowRgb &= 0x00FFFFFF;
    int[] aHistory = new int[shadowSize];
    int historyIdx;
    int aSum;
    int[] dataBuffer = ((DataBufferInt) image.getRaster().getDataBuffer()).getData();
    int lastPixelOffset = right * dstWidth;
    float sumDivider = shadowOpacity / shadowSize;
    // horizontal pass
    for (int y = 0, bufferOffset = 0; y < dstHeight; y++, bufferOffset = y * dstWidth) {
        aSum = 0;
        historyIdx = 0;
        for (int x = 0; x < shadowSize; x++, bufferOffset++) {
            int a = dataBuffer[bufferOffset] >>> 24;
            aHistory[x] = a;
            aSum += a;
        }
        bufferOffset -= right;
        for (int x = xStart; x < xStop; x++, bufferOffset++) {
            int a = (int) (aSum * sumDivider);
            dataBuffer[bufferOffset] = a << 24 | shadowRgb;
            // subtract the oldest pixel from the sum
            aSum -= aHistory[historyIdx];
            // get the latest pixel
            a = dataBuffer[bufferOffset + right] >>> 24;
            aHistory[historyIdx] = a;
            aSum += a;
            if (++historyIdx >= shadowSize) {
                historyIdx -= shadowSize;
            }
        }
    }
    // vertical pass
    for (int x = 0, bufferOffset = 0; x < dstWidth; x++, bufferOffset = x) {
        aSum = 0;
        historyIdx = 0;
        for (int y = 0; y < shadowSize; y++, bufferOffset += dstWidth) {
            int a = dataBuffer[bufferOffset] >>> 24;
            aHistory[y] = a;
            aSum += a;
        }
        bufferOffset -= lastPixelOffset;
        for (int y = yStart; y < yStop; y++, bufferOffset += dstWidth) {
            int a = (int) (aSum * sumDivider);
            dataBuffer[bufferOffset] = a << 24 | shadowRgb;
            // subtract the oldest pixel from the sum
            aSum -= aHistory[historyIdx];
            // get the latest pixel
            a = dataBuffer[bufferOffset + lastPixelOffset] >>> 24;
            aHistory[historyIdx] = a;
            aSum += a;
            if (++historyIdx >= shadowSize) {
                historyIdx -= shadowSize;
            }
        }
    }
    g2.drawImage(source, null, 0, 0);
    g2.dispose();
    return image;
}
Also used : DataBufferInt(java.awt.image.DataBufferInt) BufferedImage(java.awt.image.BufferedImage) Graphics2D(java.awt.Graphics2D)

Example 27 with DataBufferInt

use of java.awt.image.DataBufferInt in project jdk8u_jdk by JetBrains.

the class Robot method createScreenCapture.

/**
     * Creates an image containing pixels read from the screen.  This image does
     * not include the mouse cursor.
     * @param   screenRect      Rect to capture in screen coordinates
     * @return  The captured image
     * @throws  IllegalArgumentException if <code>screenRect</code> width and height are not greater than zero
     * @throws  SecurityException if <code>readDisplayPixels</code> permission is not granted
     * @see     SecurityManager#checkPermission
     * @see     AWTPermission
     */
public synchronized BufferedImage createScreenCapture(Rectangle screenRect) {
    checkScreenCaptureAllowed();
    checkValidRect(screenRect);
    BufferedImage image;
    DataBufferInt buffer;
    WritableRaster raster;
    if (screenCapCM == null) {
        /*
             * Fix for 4285201
             * Create a DirectColorModel equivalent to the default RGB ColorModel,
             * except with no Alpha component.
             */
        screenCapCM = new DirectColorModel(24, /* red mask */
        0x00FF0000, /* green mask */
        0x0000FF00, /* blue mask */
        0x000000FF);
    }
    // need to sync the toolkit prior to grabbing the pixels since in some
    // cases rendering to the screen may be delayed
    Toolkit.getDefaultToolkit().sync();
    int[] pixels;
    int[] bandmasks = new int[3];
    Rectangle devScreenRect = screenRect.getBounds();
    // devScreenRect is IN/OUT param
    pixels = peer.getRGBPixels(devScreenRect);
    buffer = new DataBufferInt(pixels, pixels.length);
    bandmasks[0] = screenCapCM.getRedMask();
    bandmasks[1] = screenCapCM.getGreenMask();
    bandmasks[2] = screenCapCM.getBlueMask();
    raster = Raster.createPackedRaster(buffer, devScreenRect.width, devScreenRect.height, devScreenRect.width, bandmasks, null);
    SunWritableRaster.makeTrackable(buffer);
    image = new BufferedImage(screenCapCM, raster, false, null);
    return image;
}
Also used : SunWritableRaster(sun.awt.image.SunWritableRaster) WritableRaster(java.awt.image.WritableRaster) DirectColorModel(java.awt.image.DirectColorModel) DataBufferInt(java.awt.image.DataBufferInt) BufferedImage(java.awt.image.BufferedImage)

Example 28 with DataBufferInt

use of java.awt.image.DataBufferInt in project jdk8u_jdk by JetBrains.

the class ImageUtil method setPackedBinaryData.

/**
     * Sets the supplied <code>Raster</code>'s data from an array
     * of packed binary data of the form returned by
     * <code>getPackedBinaryData()</code>.
     *
     * @throws IllegalArgumentException if <code>isBinary()</code> returns
     * <code>false</code> with the <code>SampleModel</code> of the
     * supplied <code>Raster</code> as argument.
     */
public static void setPackedBinaryData(byte[] binaryDataArray, WritableRaster raster, Rectangle rect) {
    SampleModel sm = raster.getSampleModel();
    if (!isBinary(sm)) {
        throw new IllegalArgumentException(I18N.getString("ImageUtil0"));
    }
    int rectX = rect.x;
    int rectY = rect.y;
    int rectWidth = rect.width;
    int rectHeight = rect.height;
    DataBuffer dataBuffer = raster.getDataBuffer();
    int dx = rectX - raster.getSampleModelTranslateX();
    int dy = rectY - raster.getSampleModelTranslateY();
    MultiPixelPackedSampleModel mpp = (MultiPixelPackedSampleModel) sm;
    int lineStride = mpp.getScanlineStride();
    int eltOffset = dataBuffer.getOffset() + mpp.getOffset(dx, dy);
    int bitOffset = mpp.getBitOffset(dx);
    int b = 0;
    if (bitOffset == 0) {
        if (dataBuffer instanceof DataBufferByte) {
            byte[] data = ((DataBufferByte) dataBuffer).getData();
            if (data == binaryDataArray) {
                // Optimal case: simply return.
                return;
            }
            int stride = (rectWidth + 7) / 8;
            int offset = 0;
            for (int y = 0; y < rectHeight; y++) {
                System.arraycopy(binaryDataArray, offset, data, eltOffset, stride);
                offset += stride;
                eltOffset += lineStride;
            }
        } else if (dataBuffer instanceof DataBufferShort || dataBuffer instanceof DataBufferUShort) {
            short[] data = dataBuffer instanceof DataBufferShort ? ((DataBufferShort) dataBuffer).getData() : ((DataBufferUShort) dataBuffer).getData();
            for (int y = 0; y < rectHeight; y++) {
                int xRemaining = rectWidth;
                int i = eltOffset;
                while (xRemaining > 8) {
                    data[i++] = (short) (((binaryDataArray[b++] & 0xFF) << 8) | (binaryDataArray[b++] & 0xFF));
                    xRemaining -= 16;
                }
                if (xRemaining > 0) {
                    data[i++] = (short) ((binaryDataArray[b++] & 0xFF) << 8);
                }
                eltOffset += lineStride;
            }
        } else if (dataBuffer instanceof DataBufferInt) {
            int[] data = ((DataBufferInt) dataBuffer).getData();
            for (int y = 0; y < rectHeight; y++) {
                int xRemaining = rectWidth;
                int i = eltOffset;
                while (xRemaining > 24) {
                    data[i++] = (int) (((binaryDataArray[b++] & 0xFF) << 24) | ((binaryDataArray[b++] & 0xFF) << 16) | ((binaryDataArray[b++] & 0xFF) << 8) | (binaryDataArray[b++] & 0xFF));
                    xRemaining -= 32;
                }
                int shift = 24;
                while (xRemaining > 0) {
                    data[i] |= (int) ((binaryDataArray[b++] & 0xFF) << shift);
                    shift -= 8;
                    xRemaining -= 8;
                }
                eltOffset += lineStride;
            }
        }
    } else {
        // bitOffset != 0
        int stride = (rectWidth + 7) / 8;
        int offset = 0;
        if (dataBuffer instanceof DataBufferByte) {
            byte[] data = ((DataBufferByte) dataBuffer).getData();
            if ((bitOffset & 7) == 0) {
                for (int y = 0; y < rectHeight; y++) {
                    System.arraycopy(binaryDataArray, offset, data, eltOffset, stride);
                    offset += stride;
                    eltOffset += lineStride;
                }
            } else {
                // bitOffset % 8 != 0
                int rightShift = bitOffset & 7;
                int leftShift = 8 - rightShift;
                int leftShift8 = 8 + leftShift;
                int mask = (byte) (255 << leftShift);
                int mask1 = (byte) ~mask;
                for (int y = 0; y < rectHeight; y++) {
                    int i = eltOffset;
                    int xRemaining = rectWidth;
                    while (xRemaining > 0) {
                        byte datum = binaryDataArray[b++];
                        if (xRemaining > leftShift8) {
                            // when all the bits in this BYTE will be set
                            // into the data buffer.
                            data[i] = (byte) ((data[i] & mask) | ((datum & 0xFF) >>> rightShift));
                            data[++i] = (byte) ((datum & 0xFF) << leftShift);
                        } else if (xRemaining > leftShift) {
                            // All the "leftShift" high bits will be set
                            // into the data buffer.  But not all the
                            // "rightShift" low bits will be set.
                            data[i] = (byte) ((data[i] & mask) | ((datum & 0xFF) >>> rightShift));
                            i++;
                            data[i] = (byte) ((data[i] & mask1) | ((datum & 0xFF) << leftShift));
                        } else {
                            // Less than "leftShift" high bits will be set.
                            int remainMask = (1 << leftShift - xRemaining) - 1;
                            data[i] = (byte) ((data[i] & (mask | remainMask)) | (datum & 0xFF) >>> rightShift & ~remainMask);
                        }
                        xRemaining -= 8;
                    }
                    eltOffset += lineStride;
                }
            }
        } else if (dataBuffer instanceof DataBufferShort || dataBuffer instanceof DataBufferUShort) {
            short[] data = dataBuffer instanceof DataBufferShort ? ((DataBufferShort) dataBuffer).getData() : ((DataBufferUShort) dataBuffer).getData();
            int rightShift = bitOffset & 7;
            int leftShift = 8 - rightShift;
            int leftShift16 = 16 + leftShift;
            int mask = (short) (~(255 << leftShift));
            int mask1 = (short) (65535 << leftShift);
            int mask2 = (short) ~mask1;
            for (int y = 0; y < rectHeight; y++) {
                int bOffset = bitOffset;
                int xRemaining = rectWidth;
                for (int x = 0; x < rectWidth; x += 8, bOffset += 8, xRemaining -= 8) {
                    int i = eltOffset + (bOffset >> 4);
                    int mod = bOffset & 15;
                    int datum = binaryDataArray[b++] & 0xFF;
                    if (mod <= 8) {
                        // This BYTE is set into one SHORT
                        if (xRemaining < 8) {
                            // Mask the bits to be set.
                            datum &= 255 << 8 - xRemaining;
                        }
                        data[i] = (short) ((data[i] & mask) | (datum << leftShift));
                    } else if (xRemaining > leftShift16) {
                        // This BYTE will be set into two SHORTs
                        data[i] = (short) ((data[i] & mask1) | ((datum >>> rightShift) & 0xFFFF));
                        data[++i] = (short) ((datum << leftShift) & 0xFFFF);
                    } else if (xRemaining > leftShift) {
                        // This BYTE will be set into two SHORTs;
                        // But not all the low bits will be set into SHORT
                        data[i] = (short) ((data[i] & mask1) | ((datum >>> rightShift) & 0xFFFF));
                        i++;
                        data[i] = (short) ((data[i] & mask2) | ((datum << leftShift) & 0xFFFF));
                    } else {
                        // Only some of the high bits will be set into
                        // SHORTs
                        int remainMask = (1 << leftShift - xRemaining) - 1;
                        data[i] = (short) ((data[i] & (mask1 | remainMask)) | ((datum >>> rightShift) & 0xFFFF & ~remainMask));
                    }
                }
                eltOffset += lineStride;
            }
        } else if (dataBuffer instanceof DataBufferInt) {
            int[] data = ((DataBufferInt) dataBuffer).getData();
            int rightShift = bitOffset & 7;
            int leftShift = 8 - rightShift;
            int leftShift32 = 32 + leftShift;
            int mask = 0xFFFFFFFF << leftShift;
            int mask1 = ~mask;
            for (int y = 0; y < rectHeight; y++) {
                int bOffset = bitOffset;
                int xRemaining = rectWidth;
                for (int x = 0; x < rectWidth; x += 8, bOffset += 8, xRemaining -= 8) {
                    int i = eltOffset + (bOffset >> 5);
                    int mod = bOffset & 31;
                    int datum = binaryDataArray[b++] & 0xFF;
                    if (mod <= 24) {
                        // This BYTE is set into one INT
                        int shift = 24 - mod;
                        if (xRemaining < 8) {
                            // Mask the bits to be set.
                            datum &= 255 << 8 - xRemaining;
                        }
                        data[i] = (data[i] & (~(255 << shift))) | (datum << shift);
                    } else if (xRemaining > leftShift32) {
                        // All the bits of this BYTE will be set into two INTs
                        data[i] = (data[i] & mask) | (datum >>> rightShift);
                        data[++i] = datum << leftShift;
                    } else if (xRemaining > leftShift) {
                        // This BYTE will be set into two INTs;
                        // But not all the low bits will be set into INT
                        data[i] = (data[i] & mask) | (datum >>> rightShift);
                        i++;
                        data[i] = (data[i] & mask1) | (datum << leftShift);
                    } else {
                        // Only some of the high bits will be set into INT
                        int remainMask = (1 << leftShift - xRemaining) - 1;
                        data[i] = (data[i] & (mask | remainMask)) | (datum >>> rightShift & ~remainMask);
                    }
                }
                eltOffset += lineStride;
            }
        }
    }
}
Also used : DataBufferShort(java.awt.image.DataBufferShort) ComponentSampleModel(java.awt.image.ComponentSampleModel) SampleModel(java.awt.image.SampleModel) MultiPixelPackedSampleModel(java.awt.image.MultiPixelPackedSampleModel) SinglePixelPackedSampleModel(java.awt.image.SinglePixelPackedSampleModel) MultiPixelPackedSampleModel(java.awt.image.MultiPixelPackedSampleModel) DataBufferInt(java.awt.image.DataBufferInt) DataBufferByte(java.awt.image.DataBufferByte) DataBufferUShort(java.awt.image.DataBufferUShort) Point(java.awt.Point) DataBuffer(java.awt.image.DataBuffer)

Example 29 with DataBufferInt

use of java.awt.image.DataBufferInt in project jdk8u_jdk by JetBrains.

the class ImageUtil method getPackedBinaryData.

/**
     * For the case of binary data (<code>isBinary()</code> returns
     * <code>true</code>), return the binary data as a packed byte array.
     * The data will be packed as eight bits per byte with no bit offset,
     * i.e., the first bit in each image line will be the left-most of the
     * first byte of the line.  The line stride in bytes will be
     * <code>(int)((getWidth()+7)/8)</code>.  The length of the returned
     * array will be the line stride multiplied by <code>getHeight()</code>
     *
     * @return the binary data as a packed array of bytes with zero offset
     * of <code>null</code> if the data are not binary.
     * @throws IllegalArgumentException if <code>isBinary()</code> returns
     * <code>false</code> with the <code>SampleModel</code> of the
     * supplied <code>Raster</code> as argument.
     */
public static byte[] getPackedBinaryData(Raster raster, Rectangle rect) {
    SampleModel sm = raster.getSampleModel();
    if (!isBinary(sm)) {
        throw new IllegalArgumentException(I18N.getString("ImageUtil0"));
    }
    int rectX = rect.x;
    int rectY = rect.y;
    int rectWidth = rect.width;
    int rectHeight = rect.height;
    DataBuffer dataBuffer = raster.getDataBuffer();
    int dx = rectX - raster.getSampleModelTranslateX();
    int dy = rectY - raster.getSampleModelTranslateY();
    MultiPixelPackedSampleModel mpp = (MultiPixelPackedSampleModel) sm;
    int lineStride = mpp.getScanlineStride();
    int eltOffset = dataBuffer.getOffset() + mpp.getOffset(dx, dy);
    int bitOffset = mpp.getBitOffset(dx);
    int numBytesPerRow = (rectWidth + 7) / 8;
    if (dataBuffer instanceof DataBufferByte && eltOffset == 0 && bitOffset == 0 && numBytesPerRow == lineStride && ((DataBufferByte) dataBuffer).getData().length == numBytesPerRow * rectHeight) {
        return ((DataBufferByte) dataBuffer).getData();
    }
    byte[] binaryDataArray = new byte[numBytesPerRow * rectHeight];
    int b = 0;
    if (bitOffset == 0) {
        if (dataBuffer instanceof DataBufferByte) {
            byte[] data = ((DataBufferByte) dataBuffer).getData();
            int stride = numBytesPerRow;
            int offset = 0;
            for (int y = 0; y < rectHeight; y++) {
                System.arraycopy(data, eltOffset, binaryDataArray, offset, stride);
                offset += stride;
                eltOffset += lineStride;
            }
        } else if (dataBuffer instanceof DataBufferShort || dataBuffer instanceof DataBufferUShort) {
            short[] data = dataBuffer instanceof DataBufferShort ? ((DataBufferShort) dataBuffer).getData() : ((DataBufferUShort) dataBuffer).getData();
            for (int y = 0; y < rectHeight; y++) {
                int xRemaining = rectWidth;
                int i = eltOffset;
                while (xRemaining > 8) {
                    short datum = data[i++];
                    binaryDataArray[b++] = (byte) ((datum >>> 8) & 0xFF);
                    binaryDataArray[b++] = (byte) (datum & 0xFF);
                    xRemaining -= 16;
                }
                if (xRemaining > 0) {
                    binaryDataArray[b++] = (byte) ((data[i] >>> 8) & 0XFF);
                }
                eltOffset += lineStride;
            }
        } else if (dataBuffer instanceof DataBufferInt) {
            int[] data = ((DataBufferInt) dataBuffer).getData();
            for (int y = 0; y < rectHeight; y++) {
                int xRemaining = rectWidth;
                int i = eltOffset;
                while (xRemaining > 24) {
                    int datum = data[i++];
                    binaryDataArray[b++] = (byte) ((datum >>> 24) & 0xFF);
                    binaryDataArray[b++] = (byte) ((datum >>> 16) & 0xFF);
                    binaryDataArray[b++] = (byte) ((datum >>> 8) & 0xFF);
                    binaryDataArray[b++] = (byte) (datum & 0xFF);
                    xRemaining -= 32;
                }
                int shift = 24;
                while (xRemaining > 0) {
                    binaryDataArray[b++] = (byte) ((data[i] >>> shift) & 0xFF);
                    shift -= 8;
                    xRemaining -= 8;
                }
                eltOffset += lineStride;
            }
        }
    } else {
        // bitOffset != 0
        if (dataBuffer instanceof DataBufferByte) {
            byte[] data = ((DataBufferByte) dataBuffer).getData();
            if ((bitOffset & 7) == 0) {
                int stride = numBytesPerRow;
                int offset = 0;
                for (int y = 0; y < rectHeight; y++) {
                    System.arraycopy(data, eltOffset, binaryDataArray, offset, stride);
                    offset += stride;
                    eltOffset += lineStride;
                }
            } else {
                // bitOffset % 8 != 0
                int leftShift = bitOffset & 7;
                int rightShift = 8 - leftShift;
                for (int y = 0; y < rectHeight; y++) {
                    int i = eltOffset;
                    int xRemaining = rectWidth;
                    while (xRemaining > 0) {
                        if (xRemaining > rightShift) {
                            binaryDataArray[b++] = (byte) (((data[i++] & 0xFF) << leftShift) | ((data[i] & 0xFF) >>> rightShift));
                        } else {
                            binaryDataArray[b++] = (byte) ((data[i] & 0xFF) << leftShift);
                        }
                        xRemaining -= 8;
                    }
                    eltOffset += lineStride;
                }
            }
        } else if (dataBuffer instanceof DataBufferShort || dataBuffer instanceof DataBufferUShort) {
            short[] data = dataBuffer instanceof DataBufferShort ? ((DataBufferShort) dataBuffer).getData() : ((DataBufferUShort) dataBuffer).getData();
            for (int y = 0; y < rectHeight; y++) {
                int bOffset = bitOffset;
                for (int x = 0; x < rectWidth; x += 8, bOffset += 8) {
                    int i = eltOffset + bOffset / 16;
                    int mod = bOffset % 16;
                    int left = data[i] & 0xFFFF;
                    if (mod <= 8) {
                        binaryDataArray[b++] = (byte) (left >>> (8 - mod));
                    } else {
                        int delta = mod - 8;
                        int right = data[i + 1] & 0xFFFF;
                        binaryDataArray[b++] = (byte) ((left << delta) | (right >>> (16 - delta)));
                    }
                }
                eltOffset += lineStride;
            }
        } else if (dataBuffer instanceof DataBufferInt) {
            int[] data = ((DataBufferInt) dataBuffer).getData();
            for (int y = 0; y < rectHeight; y++) {
                int bOffset = bitOffset;
                for (int x = 0; x < rectWidth; x += 8, bOffset += 8) {
                    int i = eltOffset + bOffset / 32;
                    int mod = bOffset % 32;
                    int left = data[i];
                    if (mod <= 24) {
                        binaryDataArray[b++] = (byte) (left >>> (24 - mod));
                    } else {
                        int delta = mod - 24;
                        int right = data[i + 1];
                        binaryDataArray[b++] = (byte) ((left << delta) | (right >>> (32 - delta)));
                    }
                }
                eltOffset += lineStride;
            }
        }
    }
    return binaryDataArray;
}
Also used : DataBufferShort(java.awt.image.DataBufferShort) ComponentSampleModel(java.awt.image.ComponentSampleModel) SampleModel(java.awt.image.SampleModel) MultiPixelPackedSampleModel(java.awt.image.MultiPixelPackedSampleModel) SinglePixelPackedSampleModel(java.awt.image.SinglePixelPackedSampleModel) MultiPixelPackedSampleModel(java.awt.image.MultiPixelPackedSampleModel) DataBufferInt(java.awt.image.DataBufferInt) DataBufferByte(java.awt.image.DataBufferByte) DataBufferUShort(java.awt.image.DataBufferUShort) Point(java.awt.Point) DataBuffer(java.awt.image.DataBuffer)

Example 30 with DataBufferInt

use of java.awt.image.DataBufferInt in project jdk8u_jdk by JetBrains.

the class ImageUtil method setUnpackedBinaryData.

/**
     * Copies data into the packed array of the <code>Raster</code>
     * from an array of unpacked data of the form returned by
     * <code>getUnpackedBinaryData()</code>.
     *
     * <p> If the data are binary, then the target bit will be set if
     * and only if the corresponding byte is non-zero.
     *
     * @throws IllegalArgumentException if <code>isBinary()</code> returns
     * <code>false</code> with the <code>SampleModel</code> of the
     * supplied <code>Raster</code> as argument.
     */
public static void setUnpackedBinaryData(byte[] bdata, WritableRaster raster, Rectangle rect) {
    SampleModel sm = raster.getSampleModel();
    if (!isBinary(sm)) {
        throw new IllegalArgumentException(I18N.getString("ImageUtil0"));
    }
    int rectX = rect.x;
    int rectY = rect.y;
    int rectWidth = rect.width;
    int rectHeight = rect.height;
    DataBuffer dataBuffer = raster.getDataBuffer();
    int dx = rectX - raster.getSampleModelTranslateX();
    int dy = rectY - raster.getSampleModelTranslateY();
    MultiPixelPackedSampleModel mpp = (MultiPixelPackedSampleModel) sm;
    int lineStride = mpp.getScanlineStride();
    int eltOffset = dataBuffer.getOffset() + mpp.getOffset(dx, dy);
    int bitOffset = mpp.getBitOffset(dx);
    int k = 0;
    if (dataBuffer instanceof DataBufferByte) {
        byte[] data = ((DataBufferByte) dataBuffer).getData();
        for (int y = 0; y < rectHeight; y++) {
            int bOffset = eltOffset * 8 + bitOffset;
            for (int x = 0; x < rectWidth; x++) {
                if (bdata[k++] != (byte) 0) {
                    data[bOffset / 8] |= (byte) (0x00000001 << (7 - bOffset & 7));
                }
                bOffset++;
            }
            eltOffset += lineStride;
        }
    } else if (dataBuffer instanceof DataBufferShort || dataBuffer instanceof DataBufferUShort) {
        short[] data = dataBuffer instanceof DataBufferShort ? ((DataBufferShort) dataBuffer).getData() : ((DataBufferUShort) dataBuffer).getData();
        for (int y = 0; y < rectHeight; y++) {
            int bOffset = eltOffset * 16 + bitOffset;
            for (int x = 0; x < rectWidth; x++) {
                if (bdata[k++] != (byte) 0) {
                    data[bOffset / 16] |= (short) (0x00000001 << (15 - bOffset % 16));
                }
                bOffset++;
            }
            eltOffset += lineStride;
        }
    } else if (dataBuffer instanceof DataBufferInt) {
        int[] data = ((DataBufferInt) dataBuffer).getData();
        for (int y = 0; y < rectHeight; y++) {
            int bOffset = eltOffset * 32 + bitOffset;
            for (int x = 0; x < rectWidth; x++) {
                if (bdata[k++] != (byte) 0) {
                    data[bOffset / 32] |= (int) (0x00000001 << (31 - bOffset % 32));
                }
                bOffset++;
            }
            eltOffset += lineStride;
        }
    }
}
Also used : DataBufferShort(java.awt.image.DataBufferShort) ComponentSampleModel(java.awt.image.ComponentSampleModel) SampleModel(java.awt.image.SampleModel) MultiPixelPackedSampleModel(java.awt.image.MultiPixelPackedSampleModel) SinglePixelPackedSampleModel(java.awt.image.SinglePixelPackedSampleModel) MultiPixelPackedSampleModel(java.awt.image.MultiPixelPackedSampleModel) DataBufferInt(java.awt.image.DataBufferInt) DataBufferByte(java.awt.image.DataBufferByte) DataBufferUShort(java.awt.image.DataBufferUShort) Point(java.awt.Point) DataBuffer(java.awt.image.DataBuffer)

Aggregations

DataBufferInt (java.awt.image.DataBufferInt)37 BufferedImage (java.awt.image.BufferedImage)22 DataBuffer (java.awt.image.DataBuffer)15 DataBufferByte (java.awt.image.DataBufferByte)12 DataBufferShort (java.awt.image.DataBufferShort)10 Graphics2D (java.awt.Graphics2D)9 SinglePixelPackedSampleModel (java.awt.image.SinglePixelPackedSampleModel)8 WritableRaster (java.awt.image.WritableRaster)8 SampleModel (java.awt.image.SampleModel)7 DataBufferUShort (java.awt.image.DataBufferUShort)6 MultiPixelPackedSampleModel (java.awt.image.MultiPixelPackedSampleModel)6 Point (java.awt.Point)5 ComponentSampleModel (java.awt.image.ComponentSampleModel)5 Rectangle (java.awt.Rectangle)4 IndexColorModel (java.awt.image.IndexColorModel)4 ColorModel (java.awt.image.ColorModel)3 DirectColorModel (java.awt.image.DirectColorModel)3 ByteBuffer (java.nio.ByteBuffer)3 Raster (java.awt.image.Raster)2 IOException (java.io.IOException)2