blob: 640c2284c485ef77408cb6b55f57759bd55e2a96 [file] [log] [blame]
/*
* Copyright (c) 1997, 2003, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package sun.awt.windows;
import sun.awt.CustomCursor;
import java.awt.*;
import java.awt.image.*;
import sun.awt.image.ImageRepresentation;
import sun.awt.image.IntegerComponentRaster;
import sun.awt.image.ToolkitImage;
/**
* A class to encapsulate a custom image-based cursor.
*
* @see Component#setCursor
* @author ThomasBall
*/
public class WCustomCursor extends CustomCursor {
public WCustomCursor(Image cursor, Point hotSpot, String name)
throws IndexOutOfBoundsException {
super(cursor, hotSpot, name);
}
protected void createNativeCursor(Image im, int[] pixels, int w, int h,
int xHotSpot, int yHotSpot) {
BufferedImage bimage = new BufferedImage(w, h,
BufferedImage.TYPE_INT_RGB);
Graphics g = bimage.getGraphics();
try {
if (im instanceof ToolkitImage) {
ImageRepresentation ir = ((ToolkitImage)im).getImageRep();
ir.reconstruct(ImageObserver.ALLBITS);
}
g.drawImage(im, 0, 0, w, h, null);
} finally {
g.dispose();
}
Raster raster = bimage.getRaster();
DataBuffer buffer = raster.getDataBuffer();
// REMIND: native code should use ScanStride _AND_ width
int data[] = ((DataBufferInt)buffer).getData();
byte[] andMask = new byte[w * h / 8];
int npixels = pixels.length;
for (int i = 0; i < npixels; i++) {
int ibyte = i / 8;
int omask = 1 << (7 - (i % 8));
if ((pixels[i] & 0xff000000) == 0) {
// Transparent bit
andMask[ibyte] |= omask;
}
}
{
int ficW = raster.getWidth();
if( raster instanceof IntegerComponentRaster ) {
ficW = ((IntegerComponentRaster)raster).getScanlineStride();
}
createCursorIndirect(
((DataBufferInt)bimage.getRaster().getDataBuffer()).getData(),
andMask, ficW, raster.getWidth(), raster.getHeight(),
xHotSpot, yHotSpot);
}
}
private native void createCursorIndirect(int[] rData, byte[] andMask,
int nScanStride, int width,
int height, int xHotSpot,
int yHotSpot);
/**
* Return the current value of SM_CXCURSOR.
*/
static native int getCursorWidth();
/**
* Return the current value of SM_CYCURSOR.
*/
static native int getCursorHeight();
}