/*
* Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
* ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*/
package com.sun.pisces;
public abstract class
AbstractSurface implements
Surface {
private long
nativePtr = 0L;
private int
width;
private int
height;
AbstractSurface(int
width, int
height) {
if (
width < 0) {
throw new
IllegalArgumentException("WIDTH must be positive");
}
if (
height < 0) {
throw new
IllegalArgumentException("HEIGHT must be positive");
}
final int
nbits = 32-
Integer.
numberOfLeadingZeros(
width) + 32-
Integer.
numberOfLeadingZeros(
height);
if (
nbits > 31) {
throw new
IllegalArgumentException("WIDTH * HEIGHT is too large");
}
this.
width =
width;
this.
height =
height;
}
public final void
getRGB(int[]
argb, int
offset, int
scanLength, int
x, int
y, int
width, int
height) {
this.
rgbCheck(
argb.length,
offset,
scanLength,
x,
y,
width,
height);
this.
getRGBImpl(
argb,
offset,
scanLength,
x,
y,
width,
height);
}
private native void
getRGBImpl(int[]
argb, int
offset, int
scanLength, int
x, int
y, int
width, int
height);
public final void
setRGB(int[]
argb, int
offset, int
scanLength, int
x, int
y, int
width, int
height) {
this.
rgbCheck(
argb.length,
offset,
scanLength,
x,
y,
width,
height);
this.
setRGBImpl(
argb,
offset,
scanLength,
x,
y,
width,
height);
}
private native void
setRGBImpl(int[]
argb, int
offset, int
scanLength, int
x, int
y, int
width, int
height);
private void
rgbCheck(int
arr_length, int
offset, int
scanLength, int
x, int
y, int
width, int
height) {
if (
x < 0 ||
x >= this.
width) {
throw new
IllegalArgumentException("X is out of surface");
}
if (
y < 0 ||
y >= this.
height) {
throw new
IllegalArgumentException("Y is out of surface");
}
if (
width < 0) {
throw new
IllegalArgumentException("WIDTH must be positive");
}
if (
height < 0) {
throw new
IllegalArgumentException("HEIGHT must be positive");
}
if (
x +
width > this.
width) {
throw new
IllegalArgumentException("X+WIDTH is out of surface");
}
if (
y +
height > this.
height) {
throw new
IllegalArgumentException("Y+HEIGHT is out of surface");
}
if (
offset < 0) {
throw new
IllegalArgumentException("OFFSET must be positive");
}
if (
scanLength < 0) {
throw new
IllegalArgumentException("SCAN-LENGTH must be positive");
}
if (
scanLength <
width) {
throw new
IllegalArgumentException("SCAN-LENGTH must be >= WIDTH");
}
final int
nbits = 32-
Integer.
numberOfLeadingZeros(
scanLength) + 32-
Integer.
numberOfLeadingZeros(
height);
if (
nbits > 31) {
throw new
IllegalArgumentException("SCAN-LENGTH * HEIGHT is too large");
}
if ((
offset +
scanLength*(
height-1) +
width) >
arr_length) {
throw new
IllegalArgumentException("STRIDE * HEIGHT exceeds length of data");
}
}
protected void
finalize() {
this.
nativeFinalize();
}
public final int
getWidth() {
return
width;
}
public final int
getHeight() {
return
height;
}
private native void
nativeFinalize();
}