[QUOTE=mymaksimus]jemand eine idee?[/QUOTE]Jep… der IntBuffer muss im Format RGBA sein. “getRGB()” liefert aber stets ARGB. Daraus folgt, dass die Farbwerte um 8 Stellen nach links gerollt werden müssen (“Integer.rotateLeft(value, 8)”).
[QUOTE=Marco13]Laut doku will er jedenfalls ARGB (was mich auch im ersten Moment irritiert hat)[/QUOTE]:eek: tatsächlich… das ja seltsam.
Eine weitere mögliche Fehlerquelle, die aber erst zum Tragen kommt, wenn der Cursor tatsächlich ein Bild ist… Origin der Bilder ist links unten, beim BI aber links oben. Das würde das Bild aber auch nur horizontal gespiegelt widergeben und nicht so ein kaudawelsch. Überprüf halt nach dem Aufruf der “setNativeCursor()”-Methode mal, wieviel Werte des IntBuffers verwendet wurden. “position()” sollte da halt einen Wert != 0, bestenfalls “capacity()” liefern. Wenn da 0 bei raus kommt, setzt die “set()”-Methode den Buffer leider zurück. Zuletzt kann man stat “flip()” evtl. auch mal “rewind()” versuchen.
Jop, werde eure ratschlaege zu herzen nehmen. ^^
Hab total vergessen dass es getRgb ja eventuell nur Rgb zurueckgeben koennte… ^^ ein cursor ohne transparenz macht generell wenig sin
Danke euch
Sorry Leute… Ich dachte es wäre gelöst.
Ist es aber leider nicht
Also rotateLeft hat leider nichts gebracht, dafür aber das Bild in ein neues zu kopieren - aber mit Type INT_ARGB -_-
Das Ergebniss sieht schon mal… vielversprechender aus.
Bei folgendem Code:
BufferedImage rawImage = ImageIO.read(AGL.getInputStreamFromRoot(getClass(), "cursor.png"));
BufferedImage rawImageCopy = new BufferedImage(rawImage.getWidth(), rawImage.getHeight(), BufferedImage.TYPE_INT_ARGB);
rawImageCopy.getGraphics().drawImage(rawImage, 0, 0, null);
IntBuffer buffer = BufferUtils.createIntBuffer(rawImageCopy.getWidth() * rawImageCopy.getHeight());
int rgbs[] = new int[rawImageCopy.getWidth() * rawImageCopy.getHeight()];
for(int i = 0; i < rgbs.length; i++){
rgbs** = rawImageCopy.getRGB(i % rawImageCopy.getWidth(), i / rawImageCopy.getWidth());
}
buffer.put(rgbs);
buffer.rewind();
Mouse.setNativeCursor(new Cursor(rawImageCopy.getWidth(), rawImageCopy.getHeight(), 0, rawImageCopy.getHeight() - 1, 1, buffer, null));
Und Folgendem cursor.png:
Erhalte ich folgenden Cursor:
Da getRGB anscheinend doch die alpha information enthält.
Laut GrepCode, ColorModel#getRGB(x, y):
public int More ...getRGB(Object inData) {
return (getAlpha(inData) << 24)
| (getRed(inData) << 16)
| (getGreen(inData) << 8)
| (getBlue(inData) << 0);
}
Das bild an sich ist also zu gross? Oder zu klein? (O.o) Mist das hab ich gar nicht ausprobiert oO
Was sind denn die minimums / maximums? Kann man solche dinge irgebdwo nachlesen?
Nein, es war nicht power of two. Die Funktion gibt das ans Betriebssystem weiter, entsprechend hängt es vom Betriebssystem ab, was gültig ist. Unter Windows 7 scheint es z.B. A8R8G8B8 mit Abmessungen von 2^n und einem Alpha von 0.0 oder 1.0 zu sein. Auf anderen Betriebssystemen oder Versionen, können das andere Werte sein.
Ich würde diese Funktion ohnehin nicht nutzen. Ein einfaches texturiertes Rechteck fügt sich imho wesentlich sauberer in den Render-Loop ein.