Move RenderScript from graphics/ to new fw/base subdirectory rs.

Change-Id: I30b6633578f063840e1bdbcc9ba513b727912a6d
This commit is contained in:
Tim Murray
2013-12-17 13:28:17 -08:00
parent 0a11eb10ff
commit d1576fb039
63 changed files with 0 additions and 0 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,246 @@
/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.renderscript;
/**
* Only intended for use by generated reflected code.
*
**/
public class AllocationAdapter extends Allocation {
AllocationAdapter(long id, RenderScript rs, Allocation alloc) {
super(id, rs, alloc.mType, alloc.mUsage);
mAdaptedAllocation = alloc;
}
long getID(RenderScript rs) {
throw new RSInvalidStateException(
"This operation is not supported with adapters at this time.");
}
/**
* @hide
*/
public void subData(int xoff, FieldPacker fp) {
super.setFromFieldPacker(xoff, fp);
}
/**
* @hide
*/
public void subElementData(int xoff, int component_number, FieldPacker fp) {
super.setFromFieldPacker(xoff, component_number, fp);
}
/**
* @hide
*/
public void subData1D(int off, int count, int[] d) {
super.copy1DRangeFrom(off, count, d);
}
/**
* @hide
*/
public void subData1D(int off, int count, short[] d) {
super.copy1DRangeFrom(off, count, d);
}
/**
* @hide
*/
public void subData1D(int off, int count, byte[] d) {
super.copy1DRangeFrom(off, count, d);
}
/**
* @hide
*/
public void subData1D(int off, int count, float[] d) {
super.copy1DRangeFrom(off, count, d);
}
/**
* @hide
*/
public void subData2D(int xoff, int yoff, int w, int h, int[] d) {
super.copy2DRangeFrom(xoff, yoff, w, h, d);
}
/**
* @hide
*/
public void subData2D(int xoff, int yoff, int w, int h, float[] d) {
super.copy2DRangeFrom(xoff, yoff, w, h, d);
}
/**
* @hide
*/
public void readData(int[] d) {
super.copyTo(d);
}
/**
* @hide
*/
public void readData(float[] d) {
super.copyTo(d);
}
void initLOD(int lod) {
if (lod < 0) {
throw new RSIllegalArgumentException("Attempting to set negative lod (" + lod + ").");
}
int tx = mAdaptedAllocation.mType.getX();
int ty = mAdaptedAllocation.mType.getY();
int tz = mAdaptedAllocation.mType.getZ();
for (int ct=0; ct < lod; ct++) {
if ((tx==1) && (ty == 1) && (tz == 1)) {
throw new RSIllegalArgumentException("Attempting to set lod (" + lod + ") out of range.");
}
if (tx > 1) tx >>= 1;
if (ty > 1) ty >>= 1;
if (tz > 1) tz >>= 1;
}
mCurrentDimX = tx;
mCurrentDimY = ty;
mCurrentDimZ = tz;
mCurrentCount = mCurrentDimX;
if (mCurrentDimY > 1) {
mCurrentCount *= mCurrentDimY;
}
if (mCurrentDimZ > 1) {
mCurrentCount *= mCurrentDimZ;
}
mSelectedY = 0;
mSelectedZ = 0;
}
/**
* Set the active LOD. The LOD must be within the range for the
* type being adapted. The base allocation must have mipmaps.
*
* Because this changes the dimensions of the adapter the
* current Y and Z will be reset.
*
* @param lod The LOD to make active.
*/
public void setLOD(int lod) {
if (!mAdaptedAllocation.getType().hasMipmaps()) {
throw new RSInvalidStateException("Cannot set LOD when the allocation type does not include mipmaps.");
}
if (!mConstrainedLOD) {
throw new RSInvalidStateException("Cannot set LOD when the adapter includes mipmaps.");
}
initLOD(lod);
}
/**
* Set the active Face. The base allocation must be of a type
* that includes faces.
*
* @param cf The face to make active.
*/
public void setFace(Type.CubemapFace cf) {
if (!mAdaptedAllocation.getType().hasFaces()) {
throw new RSInvalidStateException("Cannot set Face when the allocation type does not include faces.");
}
if (!mConstrainedFace) {
throw new RSInvalidStateException("Cannot set LOD when the adapter includes mipmaps.");
}
if (cf == null) {
throw new RSIllegalArgumentException("Cannot set null face.");
}
mSelectedFace = cf;
}
/**
* Set the active Y. The y value must be within the range for
* the allocation being adapted. The base allocation must
* contain the Y dimension.
*
* @param y The y to make active.
*/
public void setY(int y) {
if (mAdaptedAllocation.getType().getY() == 0) {
throw new RSInvalidStateException("Cannot set Y when the allocation type does not include Y dim.");
}
if (mAdaptedAllocation.getType().getY() <= y) {
throw new RSInvalidStateException("Cannot set Y greater than dimension of allocation.");
}
if (!mConstrainedY) {
throw new RSInvalidStateException("Cannot set Y when the adapter includes Y.");
}
mSelectedY = y;
}
/**
* Set the active Z. The z value must be within the range for
* the allocation being adapted. The base allocation must
* contain the Z dimension.
*
* @param z The z to make active.
*/
public void setZ(int z) {
if (mAdaptedAllocation.getType().getZ() == 0) {
throw new RSInvalidStateException("Cannot set Z when the allocation type does not include Z dim.");
}
if (mAdaptedAllocation.getType().getZ() <= z) {
throw new RSInvalidStateException("Cannot set Z greater than dimension of allocation.");
}
if (!mConstrainedZ) {
throw new RSInvalidStateException("Cannot set Z when the adapter includes Z.");
}
mSelectedZ = z;
}
static public AllocationAdapter create1D(RenderScript rs, Allocation a) {
rs.validate();
AllocationAdapter aa = new AllocationAdapter(0, rs, a);
aa.mConstrainedLOD = true;
aa.mConstrainedFace = true;
aa.mConstrainedY = true;
aa.mConstrainedZ = true;
aa.initLOD(0);
return aa;
}
static public AllocationAdapter create2D(RenderScript rs, Allocation a) {
android.util.Log.e("rs", "create2d " + a);
rs.validate();
AllocationAdapter aa = new AllocationAdapter(0, rs, a);
aa.mConstrainedLOD = true;
aa.mConstrainedFace = true;
aa.mConstrainedY = false;
aa.mConstrainedZ = true;
aa.initLOD(0);
return aa;
}
/**
* Override the Allocation resize. Resizing adapters is not
* allowed and will throw a RSInvalidStateException.
*
* @param dimX ignored.
*/
public synchronized void resize(int dimX) {
throw new RSInvalidStateException("Resize not allowed for Adapters.");
}
}

View File

@@ -0,0 +1,177 @@
/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.renderscript;
/**
* BaseObj is the base class for all RenderScript objects owned by a RS context.
* It is responsible for lifetime management and resource tracking. This class
* should not be used by a user application.
*
**/
public class BaseObj {
BaseObj(long id, RenderScript rs) {
rs.validate();
mRS = rs;
mID = id;
mDestroyed = false;
}
void setID(int id) {
if (mID != 0) {
throw new RSRuntimeException("Internal Error, reset of object ID.");
}
mID = id;
}
/**
* Lookup the native object ID for this object. Primarily used by the
* generated reflected code.
*
* @param rs Context to verify against internal context for
* match.
*
* @return long
*/
long getID(RenderScript rs) {
mRS.validate();
if (mDestroyed) {
throw new RSInvalidStateException("using a destroyed object.");
}
if (mID == 0) {
throw new RSRuntimeException("Internal error: Object id 0.");
}
if ((rs != null) && (rs != mRS)) {
throw new RSInvalidStateException("using object with mismatched context.");
}
return mID;
}
void checkValid() {
if (mID == 0) {
throw new RSIllegalArgumentException("Invalid object.");
}
}
private long mID;
private boolean mDestroyed;
private String mName;
RenderScript mRS;
/**
* setName assigns a name to an object. This object can later be looked up
* by this name.
*
* @param name The name to assign to the object.
*/
public void setName(String name) {
if (name == null) {
throw new RSIllegalArgumentException(
"setName requires a string of non-zero length.");
}
if(name.length() < 1) {
throw new RSIllegalArgumentException(
"setName does not accept a zero length string.");
}
if(mName != null) {
throw new RSIllegalArgumentException(
"setName object already has a name.");
}
try {
byte[] bytes = name.getBytes("UTF-8");
mRS.nAssignName(mID, bytes);
mName = name;
} catch (java.io.UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
/**
* @return name of the renderscript object
*/
public String getName() {
return mName;
}
protected void finalize() throws Throwable {
if (!mDestroyed) {
if(mID != 0 && mRS.isAlive()) {
mRS.nObjDestroy(mID);
}
mRS = null;
mID = 0;
mDestroyed = true;
//Log.v(RenderScript.LOG_TAG, getClass() +
// " auto finalizing object without having released the RS reference.");
}
super.finalize();
}
/**
* Frees any native resources associated with this object. The
* primary use is to force immediate cleanup of resources when it is
* believed the GC will not respond quickly enough.
*/
synchronized public void destroy() {
if(mDestroyed) {
throw new RSInvalidStateException("Object already destroyed.");
}
mDestroyed = true;
mRS.nObjDestroy(mID);
}
/**
* If an object came from an a3d file, java fields need to be
* created with objects from the native layer
*/
void updateFromNative() {
mRS.validate();
mName = mRS.nGetName(getID(mRS));
}
/**
* Calculates the hash code value for a BaseObj.
*
* @return int
*/
@Override
public int hashCode() {
return (int)((mID & 0xfffffff) ^ (mID >> 32));
}
/**
* Compare the current BaseObj with another BaseObj for equality.
*
* @param obj The object to check equality with.
*
* @return boolean
*/
@Override
public boolean equals(Object obj) {
// Early-out check to see if both BaseObjs are actually the same
if (this == obj)
return true;
if (getClass() != obj.getClass()) {
return false;
}
BaseObj b = (BaseObj) obj;
return mID == b.mID;
}
}

View File

@@ -0,0 +1,391 @@
/*
* Copyright (C) 2009 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.renderscript;
/**
* Class for exposing the native RenderScript byte2 type back to the Android system.
*
**/
public class Byte2 {
public byte x;
public byte y;
public Byte2() {
}
public Byte2(byte initX, byte initY) {
x = initX;
y = initY;
}
/** @hide */
public Byte2(Byte2 source) {
this.x = source.x;
this.y = source.y;
}
/** @hide
* Vector add
*
* @param a
*/
public void add(Byte2 a) {
this.x += a.x;
this.y += a.y;
}
/** @hide
* Vector add
*
* @param a
* @param b
* @return
*/
public static Byte2 add(Byte2 a, Byte2 b) {
Byte2 result = new Byte2();
result.x = (byte)(a.x + b.x);
result.y = (byte)(a.y + b.y);
return result;
}
/** @hide
* Vector add
*
* @param value
*/
public void add(byte value) {
x += value;
y += value;
}
/** @hide
* Vector add
*
* @param a
* @param b
* @return
*/
public static Byte2 add(Byte2 a, byte b) {
Byte2 result = new Byte2();
result.x = (byte)(a.x + b);
result.y = (byte)(a.y + b);
return result;
}
/** @hide
* Vector subtraction
*
* @param a
*/
public void sub(Byte2 a) {
this.x -= a.x;
this.y -= a.y;
}
/** @hide
* Vector subtraction
*
* @param a
* @param b
* @return
*/
public static Byte2 sub(Byte2 a, Byte2 b) {
Byte2 result = new Byte2();
result.x = (byte)(a.x - b.x);
result.y = (byte)(a.y - b.y);
return result;
}
/** @hide
* Vector subtraction
*
* @param value
*/
public void sub(byte value) {
x -= value;
y -= value;
}
/** @hide
* Vector subtraction
*
* @param a
* @param b
* @return
*/
public static Byte2 sub(Byte2 a, byte b) {
Byte2 result = new Byte2();
result.x = (byte)(a.x - b);
result.y = (byte)(a.y - b);
return result;
}
/** @hide
* Vector multiplication
*
* @param a
*/
public void mul(Byte2 a) {
this.x *= a.x;
this.y *= a.y;
}
/** @hide
* Vector multiplication
*
* @param a
* @param b
* @return
*/
public static Byte2 mul(Byte2 a, Byte2 b) {
Byte2 result = new Byte2();
result.x = (byte)(a.x * b.x);
result.y = (byte)(a.y * b.y);
return result;
}
/** @hide
* Vector multiplication
*
* @param value
*/
public void mul(byte value) {
x *= value;
y *= value;
}
/** @hide
* Vector multiplication
*
* @param a
* @param b
* @return
*/
public static Byte2 mul(Byte2 a, byte b) {
Byte2 result = new Byte2();
result.x = (byte)(a.x * b);
result.y = (byte)(a.y * b);
return result;
}
/** @hide
* Vector division
*
* @param a
*/
public void div(Byte2 a) {
this.x /= a.x;
this.y /= a.y;
}
/** @hide
* Vector division
*
* @param a
* @param b
* @return
*/
public static Byte2 div(Byte2 a, Byte2 b) {
Byte2 result = new Byte2();
result.x = (byte)(a.x / b.x);
result.y = (byte)(a.y / b.y);
return result;
}
/** @hide
* Vector division
*
* @param value
*/
public void div(byte value) {
x /= value;
y /= value;
}
/** @hide
* Vector division
*
* @param a
* @param b
* @return
*/
public static Byte2 div(Byte2 a, byte b) {
Byte2 result = new Byte2();
result.x = (byte)(a.x / b);
result.y = (byte)(a.y / b);
return result;
}
/** @hide
* get vector length
*
* @return
*/
public byte length() {
return 2;
}
/** @hide
* set vector negate
*/
public void negate() {
this.x = (byte)(-x);
this.y = (byte)(-y);
}
/** @hide
* Vector dot Product
*
* @param a
* @return
*/
public byte dotProduct(Byte2 a) {
return (byte)((x * a.x) + (y * a.y));
}
/** @hide
* Vector dot Product
*
* @param a
* @param b
* @return
*/
public static byte dotProduct(Byte2 a, Byte2 b) {
return (byte)((b.x * a.x) + (b.y * a.y));
}
/** @hide
* Vector add Multiple
*
* @param a
* @param factor
*/
public void addMultiple(Byte2 a, byte factor) {
x += a.x * factor;
y += a.y * factor;
}
/** @hide
* set vector value by Byte2
*
* @param a
*/
public void set(Byte2 a) {
this.x = a.x;
this.y = a.y;
}
/** @hide
* set the vector field value by Char
*
* @param a
* @param b
*/
public void setValues(byte a, byte b) {
this.x = a;
this.y = b;
}
/** @hide
* return the element sum of vector
*
* @return
*/
public byte elementSum() {
return (byte)(x + y);
}
/** @hide
* get the vector field value by index
*
* @param i
* @return
*/
public byte get(int i) {
switch (i) {
case 0:
return x;
case 1:
return y;
default:
throw new IndexOutOfBoundsException("Index: i");
}
}
/** @hide
* set the vector field value by index
*
* @param i
* @param value
*/
public void setAt(int i, byte value) {
switch (i) {
case 0:
x = value;
return;
case 1:
y = value;
return;
default:
throw new IndexOutOfBoundsException("Index: i");
}
}
/** @hide
* add the vector field value by index
*
* @param i
* @param value
*/
public void addAt(int i, byte value) {
switch (i) {
case 0:
x += value;
return;
case 1:
y += value;
return;
default:
throw new IndexOutOfBoundsException("Index: i");
}
}
/** @hide
* copy the vector to Char array
*
* @param data
* @param offset
*/
public void copyTo(byte[] data, int offset) {
data[offset] = x;
data[offset + 1] = y;
}
}

View File

@@ -0,0 +1,423 @@
/*
* Copyright (C) 2009 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.renderscript;
/**
* Class for exposing the native RenderScript byte3 type back to the Android system.
*
**/
public class Byte3 {
public byte x;
public byte y;
public byte z;
public Byte3() {
}
public Byte3(byte initX, byte initY, byte initZ) {
x = initX;
y = initY;
z = initZ;
}
/** @hide */
public Byte3(Byte3 source) {
this.x = source.x;
this.y = source.y;
this.z = source.z;
}
/** @hide
* Vector add
*
* @param a
*/
public void add(Byte3 a) {
this.x += a.x;
this.y += a.y;
this.z += a.z;
}
/** @hide
* Vector add
*
* @param a
* @param b
* @return
*/
public static Byte3 add(Byte3 a, Byte3 b) {
Byte3 result = new Byte3();
result.x = (byte)(a.x + b.x);
result.y = (byte)(a.y + b.y);
result.z = (byte)(a.z + b.z);
return result;
}
/** @hide
* Vector add
*
* @param value
*/
public void add(byte value) {
x += value;
y += value;
z += value;
}
/** @hide
* Vector add
*
* @param a
* @param b
* @return
*/
public static Byte3 add(Byte3 a, byte b) {
Byte3 result = new Byte3();
result.x = (byte)(a.x + b);
result.y = (byte)(a.y + b);
result.z = (byte)(a.z + b);
return result;
}
/** @hide
* Vector subtraction
*
* @param a
*/
public void sub(Byte3 a) {
this.x -= a.x;
this.y -= a.y;
this.z -= a.z;
}
/** @hide
* Vector subtraction
*
* @param a
* @param b
* @return
*/
public static Byte3 sub(Byte3 a, Byte3 b) {
Byte3 result = new Byte3();
result.x = (byte)(a.x - b.x);
result.y = (byte)(a.y - b.y);
result.z = (byte)(a.z - b.z);
return result;
}
/** @hide
* Vector subtraction
*
* @param value
*/
public void sub(byte value) {
x -= value;
y -= value;
z -= value;
}
/** @hide
* Vector subtraction
*
* @param a
* @param b
* @return
*/
public static Byte3 sub(Byte3 a, byte b) {
Byte3 result = new Byte3();
result.x = (byte)(a.x - b);
result.y = (byte)(a.y - b);
result.z = (byte)(a.z - b);
return result;
}
/** @hide
* Vector multiplication
*
* @param a
*/
public void mul(Byte3 a) {
this.x *= a.x;
this.y *= a.y;
this.z *= a.z;
}
/** @hide
* Vector multiplication
*
* @param a
* @param b
* @return
*/
public static Byte3 mul(Byte3 a, Byte3 b) {
Byte3 result = new Byte3();
result.x = (byte)(a.x * b.x);
result.y = (byte)(a.y * b.y);
result.z = (byte)(a.z * b.z);
return result;
}
/** @hide
* Vector multiplication
*
* @param value
*/
public void mul(byte value) {
x *= value;
y *= value;
z *= value;
}
/** @hide
* Vector multiplication
*
* @param a
* @param b
* @return
*/
public static Byte3 mul(Byte3 a, byte b) {
Byte3 result = new Byte3();
result.x = (byte)(a.x * b);
result.y = (byte)(a.y * b);
result.z = (byte)(a.z * b);
return result;
}
/** @hide
* Vector division
*
* @param a
*/
public void div(Byte3 a) {
this.x /= a.x;
this.y /= a.y;
this.z /= a.z;
}
/** @hide
* Vector division
*
* @param a
* @param b
* @return
*/
public static Byte3 div(Byte3 a, Byte3 b) {
Byte3 result = new Byte3();
result.x = (byte)(a.x / b.x);
result.y = (byte)(a.y / b.y);
result.z = (byte)(a.z / b.z);
return result;
}
/** @hide
* Vector division
*
* @param value
*/
public void div(byte value) {
x /= value;
y /= value;
z /= value;
}
/** @hide
* Vector division
*
* @param a
* @param b
* @return
*/
public static Byte3 div(Byte3 a, byte b) {
Byte3 result = new Byte3();
result.x = (byte)(a.x / b);
result.y = (byte)(a.y / b);
result.z = (byte)(a.z / b);
return result;
}
/** @hide
* get vector length
*
* @return
*/
public byte length() {
return 3;
}
/** @hide
* set vector negate
*/
public void negate() {
this.x = (byte)(-x);
this.y = (byte)(-y);
this.z = (byte)(-z);
}
/** @hide
* Vector dot Product
*
* @param a
* @return
*/
public byte dotProduct(Byte3 a) {
return (byte)((byte)((byte)(x * a.x) + (byte)(y * a.y)) + (byte)(z * a.z));
}
/** @hide
* Vector dot Product
*
* @param a
* @param b
* @return
*/
public static byte dotProduct(Byte3 a, Byte3 b) {
return (byte)((byte)((byte)(b.x * a.x) + (byte)(b.y * a.y)) + (byte)(b.z * a.z));
}
/** @hide
* Vector add Multiple
*
* @param a
* @param factor
*/
public void addMultiple(Byte3 a, byte factor) {
x += a.x * factor;
y += a.y * factor;
z += a.z * factor;
}
/** @hide
* set vector value by Byte3
*
* @param a
*/
public void set(Byte3 a) {
this.x = a.x;
this.y = a.y;
this.z = a.z;
}
/** @hide
* set the vector field value by Char
*
* @param a
* @param b
* @param c
*/
public void setValues(byte a, byte b, byte c) {
this.x = a;
this.y = b;
this.z = c;
}
/** @hide
* return the element sum of vector
*
* @return
*/
public byte elementSum() {
return (byte)(x + y + z);
}
/** @hide
* get the vector field value by index
*
* @param i
* @return
*/
public byte get(int i) {
switch (i) {
case 0:
return x;
case 1:
return y;
case 2:
return z;
default:
throw new IndexOutOfBoundsException("Index: i");
}
}
/** @hide
* set the vector field value by index
*
* @param i
* @param value
*/
public void setAt(int i, byte value) {
switch (i) {
case 0:
x = value;
return;
case 1:
y = value;
return;
case 2:
z = value;
return;
default:
throw new IndexOutOfBoundsException("Index: i");
}
}
/** @hide
* add the vector field value by index
*
* @param i
* @param value
*/
public void addAt(int i, byte value) {
switch (i) {
case 0:
x += value;
return;
case 1:
y += value;
return;
case 2:
z += value;
return;
default:
throw new IndexOutOfBoundsException("Index: i");
}
}
/** @hide
* copy the vector to Char array
*
* @param data
* @param offset
*/
public void copyTo(byte[] data, int offset) {
data[offset] = x;
data[offset + 1] = y;
data[offset + 2] = z;
}
}

View File

@@ -0,0 +1,454 @@
/*
* Copyright (C) 2009 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.renderscript;
/**
* Class for exposing the native RenderScript byte4 type back to the Android system.
*
**/
public class Byte4 {
public byte x;
public byte y;
public byte z;
public byte w;
public Byte4() {
}
public Byte4(byte initX, byte initY, byte initZ, byte initW) {
x = initX;
y = initY;
z = initZ;
w = initW;
}
/** @hide */
public Byte4(Byte4 source) {
this.x = source.x;
this.y = source.y;
this.z = source.z;
this.w = source.w;
}
/** @hide
* Vector add
*
* @param a
*/
public void add(Byte4 a) {
this.x += a.x;
this.y += a.y;
this.z += a.z;
this.w += a.w;
}
/** @hide
* Vector add
*
* @param a
* @param b
* @return
*/
public static Byte4 add(Byte4 a, Byte4 b) {
Byte4 result = new Byte4();
result.x = (byte)(a.x + b.x);
result.y = (byte)(a.y + b.y);
result.z = (byte)(a.z + b.z);
result.w = (byte)(a.w + b.w);
return result;
}
/** @hide
* Vector add
*
* @param value
*/
public void add(byte value) {
x += value;
y += value;
z += value;
w += value;
}
/** @hide
* Vector add
*
* @param a
* @param b
* @return
*/
public static Byte4 add(Byte4 a, byte b) {
Byte4 result = new Byte4();
result.x = (byte)(a.x + b);
result.y = (byte)(a.y + b);
result.z = (byte)(a.z + b);
result.w = (byte)(a.w + b);
return result;
}
/** @hide
* Vector subtraction
*
* @param a
*/
public void sub(Byte4 a) {
this.x -= a.x;
this.y -= a.y;
this.z -= a.z;
this.w -= a.w;
}
/** @hide
* Vector subtraction
*
* @param a
* @param b
* @return
*/
public static Byte4 sub(Byte4 a, Byte4 b) {
Byte4 result = new Byte4();
result.x = (byte)(a.x - b.x);
result.y = (byte)(a.y - b.y);
result.z = (byte)(a.z - b.z);
result.w = (byte)(a.w - b.w);
return result;
}
/** @hide
* Vector subtraction
*
* @param value
*/
public void sub(byte value) {
x -= value;
y -= value;
z -= value;
w -= value;
}
/** @hide
* Vector subtraction
*
* @param a
* @param b
* @return
*/
public static Byte4 sub(Byte4 a, byte b) {
Byte4 result = new Byte4();
result.x = (byte)(a.x - b);
result.y = (byte)(a.y - b);
result.z = (byte)(a.z - b);
result.w = (byte)(a.w - b);
return result;
}
/** @hide
* Vector multiplication
*
* @param a
*/
public void mul(Byte4 a) {
this.x *= a.x;
this.y *= a.y;
this.z *= a.z;
this.w *= a.w;
}
/** @hide
* Vector multiplication
*
* @param a
* @param b
* @return
*/
public static Byte4 mul(Byte4 a, Byte4 b) {
Byte4 result = new Byte4();
result.x = (byte)(a.x * b.x);
result.y = (byte)(a.y * b.y);
result.z = (byte)(a.z * b.z);
result.w = (byte)(a.w * b.w);
return result;
}
/** @hide
* Vector multiplication
*
* @param value
*/
public void mul(byte value) {
x *= value;
y *= value;
z *= value;
w *= value;
}
/** @hide
* Vector multiplication
*
* @param a
* @param b
* @return
*/
public static Byte4 mul(Byte4 a, byte b) {
Byte4 result = new Byte4();
result.x = (byte)(a.x * b);
result.y = (byte)(a.y * b);
result.z = (byte)(a.z * b);
result.w = (byte)(a.w * b);
return result;
}
/** @hide
* Vector division
*
* @param a
*/
public void div(Byte4 a) {
this.x /= a.x;
this.y /= a.y;
this.z /= a.z;
this.w /= a.w;
}
/** @hide
* Vector division
*
* @param a
* @param b
* @return
*/
public static Byte4 div(Byte4 a, Byte4 b) {
Byte4 result = new Byte4();
result.x = (byte)(a.x / b.x);
result.y = (byte)(a.y / b.y);
result.z = (byte)(a.z / b.z);
result.w = (byte)(a.w / b.w);
return result;
}
/** @hide
* Vector division
*
* @param value
*/
public void div(byte value) {
x /= value;
y /= value;
z /= value;
w /= value;
}
/** @hide
* Vector division
*
* @param a
* @param b
* @return
*/
public static Byte4 div(Byte4 a, byte b) {
Byte4 result = new Byte4();
result.x = (byte)(a.x / b);
result.y = (byte)(a.y / b);
result.z = (byte)(a.z / b);
result.w = (byte)(a.w / b);
return result;
}
/** @hide
* get vector length
*
* @return
*/
public byte length() {
return 4;
}
/** @hide
* set vector negate
*/
public void negate() {
this.x = (byte)(-x);
this.y = (byte)(-y);
this.z = (byte)(-z);
this.w = (byte)(-w);
}
/** @hide
* Vector dot Product
*
* @param a
* @return
*/
public byte dotProduct(Byte4 a) {
return (byte)((x * a.x) + (y * a.y) + (z * a.z) + (w * a.w));
}
/** @hide
* Vector dot Product
*
* @param a
* @param b
* @return
*/
public static byte dotProduct(Byte4 a, Byte4 b) {
return (byte)((b.x * a.x) + (b.y * a.y) + (b.z * a.z) + (b.w * a.w));
}
/** @hide
* Vector add Multiple
*
* @param a
* @param factor
*/
public void addMultiple(Byte4 a, byte factor) {
x += a.x * factor;
y += a.y * factor;
z += a.z * factor;
w += a.w * factor;
}
/** @hide
* set vector value by Byte4
*
* @param a
*/
public void set(Byte4 a) {
this.x = a.x;
this.y = a.y;
this.z = a.z;
this.w = a.w;
}
/** @hide
* set the vector field values
*
* @param a
* @param b
* @param c
* @param d
*/
public void setValues(byte a, byte b, byte c, byte d) {
this.x = a;
this.y = b;
this.z = c;
this.w = d;
}
/** @hide
* return the element sum of vector
*
* @return
*/
public byte elementSum() {
return (byte)(x + y + z + w);
}
/** @hide
* get the vector field value by index
*
* @param i
* @return
*/
public byte get(int i) {
switch (i) {
case 0:
return x;
case 1:
return y;
case 2:
return z;
case 3:
return w;
default:
throw new IndexOutOfBoundsException("Index: i");
}
}
/** @hide
* set the vector field value by index
*
* @param i
* @param value
*/
public void setAt(int i, byte value) {
switch (i) {
case 0:
x = value;
return;
case 1:
y = value;
return;
case 2:
z = value;
return;
case 3:
w = value;
return;
default:
throw new IndexOutOfBoundsException("Index: i");
}
}
/** @hide
* add the vector field value by index
*
* @param i
* @param value
*/
public void addAt(int i, byte value) {
switch (i) {
case 0:
x += value;
return;
case 1:
y += value;
return;
case 2:
z += value;
return;
case 3:
w += value;
return;
default:
throw new IndexOutOfBoundsException("Index: i");
}
}
/** @hide
* copy the vector to Char array
*
* @param data
* @param offset
*/
public void copyTo(byte[] data, int offset) {
data[offset] = x;
data[offset + 1] = y;
data[offset + 2] = z;
data[offset + 3] = w;
}
}

View File

@@ -0,0 +1,385 @@
/*
* Copyright (C) 2013 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.renderscript;
/**
* Vector version of the basic double type.
* Provides two double fields packed.
*/
public class Double2 {
public double x;
public double y;
public Double2() {
}
/** @hide */
public Double2(Double2 data) {
this.x = data.x;
this.y = data.y;
}
public Double2(double x, double y) {
this.x = x;
this.y = y;
}
/** @hide
* Vector add
*
* @param a
* @param b
* @return
*/
public static Double2 add(Double2 a, Double2 b) {
Double2 res = new Double2();
res.x = a.x + b.x;
res.y = a.y + b.y;
return res;
}
/** @hide
* Vector add
*
* @param value
*/
public void add(Double2 value) {
x += value.x;
y += value.y;
}
/** @hide
* Vector add
*
* @param value
*/
public void add(double value) {
x += value;
y += value;
}
/** @hide
* Vector add
*
* @param a
* @param b
* @return
*/
public static Double2 add(Double2 a, double b) {
Double2 res = new Double2();
res.x = a.x + b;
res.y = a.y + b;
return res;
}
/** @hide
* Vector subtraction
*
* @param value
*/
public void sub(Double2 value) {
x -= value.x;
y -= value.y;
}
/** @hide
* Vector subtraction
*
* @param a
* @param b
* @return
*/
public static Double2 sub(Double2 a, Double2 b) {
Double2 res = new Double2();
res.x = a.x - b.x;
res.y = a.y - b.y;
return res;
}
/** @hide
* Vector subtraction
*
* @param value
*/
public void sub(double value) {
x -= value;
y -= value;
}
/** @hide
* Vector subtraction
*
* @param a
* @param b
* @return
*/
public static Double2 sub(Double2 a, double b) {
Double2 res = new Double2();
res.x = a.x - b;
res.y = a.y - b;
return res;
}
/** @hide
* Vector multiplication
*
* @param value
*/
public void mul(Double2 value) {
x *= value.x;
y *= value.y;
}
/** @hide
* Vector multiplication
*
* @param a
* @param b
* @return
*/
public static Double2 mul(Double2 a, Double2 b) {
Double2 res = new Double2();
res.x = a.x * b.x;
res.y = a.y * b.y;
return res;
}
/** @hide
* Vector multiplication
*
* @param value
*/
public void mul(double value) {
x *= value;
y *= value;
}
/** @hide
* Vector multiplication
*
* @param a
* @param b
* @return
*/
public static Double2 mul(Double2 a, double b) {
Double2 res = new Double2();
res.x = a.x * b;
res.y = a.y * b;
return res;
}
/** @hide
* Vector division
*
* @param value
*/
public void div(Double2 value) {
x /= value.x;
y /= value.y;
}
/** @hide
* Vector division
*
* @param a
* @param b
* @return
*/
public static Double2 div(Double2 a, Double2 b) {
Double2 res = new Double2();
res.x = a.x / b.x;
res.y = a.y / b.y;
return res;
}
/** @hide
* Vector division
*
* @param value
*/
public void div(double value) {
x /= value;
y /= value;
}
/** @hide
* Vector division
*
* @param a
* @param b
* @return
*/
public static Double2 div(Double2 a, double b) {
Double2 res = new Double2();
res.x = a.x / b;
res.y = a.y / b;
return res;
}
/** @hide
* Vector dot Product
*
* @param a
* @return
*/
public double dotProduct(Double2 a) {
return (x * a.x) + (y * a.y);
}
/** @hide
* Vector dot Product
*
* @param a
* @param b
* @return
*/
public static Double dotProduct(Double2 a, Double2 b) {
return (b.x * a.x) + (b.y * a.y);
}
/** @hide
* Vector add Multiple
*
* @param a
* @param factor
*/
public void addMultiple(Double2 a, double factor) {
x += a.x * factor;
y += a.y * factor;
}
/** @hide
* Set vector value by double2
*
* @param a
*/
public void set(Double2 a) {
this.x = a.x;
this.y = a.y;
}
/** @hide
* Set vector negate
*/
public void negate() {
x = -x;
y = -y;
}
/** @hide
* Get vector length
*
* @return
*/
public int length() {
return 2;
}
/** @hide
* Return the element sum of vector
*
* @return
*/
public double elementSum() {
return x + y;
}
/** @hide
* Get the vector field value by index
*
* @param i
* @return
*/
public double get(int i) {
switch (i) {
case 0:
return x;
case 1:
return y;
default:
throw new IndexOutOfBoundsException("Index: i");
}
}
/** @hide
* Set the vector field value by index
*
* @param i
* @param value
*/
public void setAt(int i, double value) {
switch (i) {
case 0:
x = value;
return;
case 1:
y = value;
return;
default:
throw new IndexOutOfBoundsException("Index: i");
}
}
/** @hide
* Add the vector field value by index
*
* @param i
* @param value
*/
public void addAt(int i, double value) {
switch (i) {
case 0:
x += value;
return;
case 1:
y += value;
return;
default:
throw new IndexOutOfBoundsException("Index: i");
}
}
/** @hide
* Set the vector field value
*
* @param x
* @param y
*/
public void setValues(double x, double y) {
this.x = x;
this.y = y;
}
/** @hide
* Copy the vector to double array
*
* @param data
* @param offset
*/
public void copyTo(double[] data, int offset) {
data[offset] = x;
data[offset + 1] = y;
}
}

View File

@@ -0,0 +1,417 @@
/*
* Copyright (C) 2013 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.renderscript;
/**
* Vector version of the basic double type.
* Provides three double fields packed.
*/
public class Double3 {
public double x;
public double y;
public double z;
public Double3() {
}
/** @hide */
public Double3(Double3 data) {
this.x = data.x;
this.y = data.y;
this.z = data.z;
}
public Double3(double x, double y, double z) {
this.x = x;
this.y = y;
this.z = z;
}
/** @hide
* Vector add
*
* @param a
* @param b
* @return
*/
public static Double3 add(Double3 a, Double3 b) {
Double3 res = new Double3();
res.x = a.x + b.x;
res.y = a.y + b.y;
res.z = a.z + b.z;
return res;
}
/** @hide
* Vector add
*
* @param value
*/
public void add(Double3 value) {
x += value.x;
y += value.y;
z += value.z;
}
/** @hide
* Vector add
*
* @param value
*/
public void add(double value) {
x += value;
y += value;
z += value;
}
/** @hide
* Vector add
*
* @param a
* @param b
* @return
*/
public static Double3 add(Double3 a, double b) {
Double3 res = new Double3();
res.x = a.x + b;
res.y = a.y + b;
res.z = a.z + b;
return res;
}
/** @hide
* Vector subtraction
*
* @param value
*/
public void sub(Double3 value) {
x -= value.x;
y -= value.y;
z -= value.z;
}
/** @hide
* Vector subtraction
*
* @param a
* @param b
* @return
*/
public static Double3 sub(Double3 a, Double3 b) {
Double3 res = new Double3();
res.x = a.x - b.x;
res.y = a.y - b.y;
res.z = a.z - b.z;
return res;
}
/** @hide
* Vector subtraction
*
* @param value
*/
public void sub(double value) {
x -= value;
y -= value;
z -= value;
}
/** @hide
* Vector subtraction
*
* @param a
* @param b
* @return
*/
public static Double3 sub(Double3 a, double b) {
Double3 res = new Double3();
res.x = a.x - b;
res.y = a.y - b;
res.z = a.z - b;
return res;
}
/** @hide
* Vector multiplication
*
* @param value
*/
public void mul(Double3 value) {
x *= value.x;
y *= value.y;
z *= value.z;
}
/** @hide
* Vector multiplication
*
* @param a
* @param b
* @return
*/
public static Double3 mul(Double3 a, Double3 b) {
Double3 res = new Double3();
res.x = a.x * b.x;
res.y = a.y * b.y;
res.z = a.z * b.z;
return res;
}
/** @hide
* Vector multiplication
*
* @param value
*/
public void mul(double value) {
x *= value;
y *= value;
z *= value;
}
/** @hide
* Vector multiplication
*
* @param a
* @param b
* @return
*/
public static Double3 mul(Double3 a, double b) {
Double3 res = new Double3();
res.x = a.x * b;
res.y = a.y * b;
res.z = a.z * b;
return res;
}
/** @hide
* Vector division
*
* @param value
*/
public void div(Double3 value) {
x /= value.x;
y /= value.y;
z /= value.z;
}
/** @hide
* Vector division
*
* @param a
* @param b
* @return
*/
public static Double3 div(Double3 a, Double3 b) {
Double3 res = new Double3();
res.x = a.x / b.x;
res.y = a.y / b.y;
res.z = a.z / b.z;
return res;
}
/** @hide
* Vector division
*
* @param value
*/
public void div(double value) {
x /= value;
y /= value;
z /= value;
}
/** @hide
* Vector division
*
* @param a
* @param b
* @return
*/
public static Double3 div(Double3 a, double b) {
Double3 res = new Double3();
res.x = a.x / b;
res.y = a.y / b;
res.z = a.z / b;
return res;
}
/** @hide
* Vector dot Product
*
* @param a
* @return
*/
public double dotProduct(Double3 a) {
return (x * a.x) + (y * a.y) + (z * a.z);
}
/** @hide
* Vector dot Product
*
* @param a
* @param b
* @return
*/
public static double dotProduct(Double3 a, Double3 b) {
return (b.x * a.x) + (b.y * a.y) + (b.z * a.z);
}
/** @hide
* Vector add Multiple
*
* @param a
* @param factor
*/
public void addMultiple(Double3 a, double factor) {
x += a.x * factor;
y += a.y * factor;
z += a.z * factor;
}
/** @hide
* Set vector value by double3
*
* @param a
*/
public void set(Double3 a) {
this.x = a.x;
this.y = a.y;
this.z = a.z;
}
/** @hide
* Set vector negate
*/
public void negate() {
x = -x;
y = -y;
z = -z;
}
/** @hide
* Get vector length
*
* @return
*/
public int length() {
return 3;
}
/** @hide
* Return the element sum of vector
*
* @return
*/
public double elementSum() {
return x + y + z;
}
/** @hide
* Get the vector field value by index
*
* @param i
* @return
*/
public double get(int i) {
switch (i) {
case 0:
return x;
case 1:
return y;
case 2:
return z;
default:
throw new IndexOutOfBoundsException("Index: i");
}
}
/** @hide
* Set the vector field value by index
*
* @param i
* @param value
*/
public void setAt(int i, double value) {
switch (i) {
case 0:
x = value;
return;
case 1:
y = value;
return;
case 2:
z = value;
return;
default:
throw new IndexOutOfBoundsException("Index: i");
}
}
/** @hide
* Add the vector field value by index
*
* @param i
* @param value
*/
public void addAt(int i, double value) {
switch (i) {
case 0:
x += value;
return;
case 1:
y += value;
return;
case 2:
z += value;
return;
default:
throw new IndexOutOfBoundsException("Index: i");
}
}
/** @hide
* Set the vector field value
*
* @param x
* @param y
* @param z
*/
public void setValues(double x, double y, double z) {
this.x = x;
this.y = y;
this.z = z;
}
/** @hide
* Copy the vector to double array
*
* @param data
* @param offset
*/
public void copyTo(double[] data, int offset) {
data[offset] = x;
data[offset + 1] = y;
data[offset + 2] = z;
}
}

View File

@@ -0,0 +1,450 @@
/*
* Copyright (C) 2013 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.renderscript;
/**
* Vector version of the basic double type.
* Provides four double fields packed.
*/
public class Double4 {
public double x;
public double y;
public double z;
public double w;
public Double4() {
}
/** @hide */
public Double4(Double4 data) {
this.x = data.x;
this.y = data.y;
this.z = data.z;
this.w = data.w;
}
public Double4(double x, double y, double z, double w) {
this.x = x;
this.y = y;
this.z = z;
this.w = w;
}
/** @hide
* Vector add
*
* @param a
* @param b
* @return
*/
public static Double4 add(Double4 a, Double4 b) {
Double4 res = new Double4();
res.x = a.x + b.x;
res.y = a.y + b.y;
res.z = a.z + b.z;
res.w = a.w + b.w;
return res;
}
/** @hide
* Vector add
*
* @param value
*/
public void add(Double4 value) {
x += value.x;
y += value.y;
z += value.z;
w += value.w;
}
/** @hide
* Vector add
*
* @param value
*/
public void add(double value) {
x += value;
y += value;
z += value;
w += value;
}
/** @hide
* Vector add
*
* @param a
* @param b
* @return
*/
public static Double4 add(Double4 a, double b) {
Double4 res = new Double4();
res.x = a.x + b;
res.y = a.y + b;
res.z = a.z + b;
res.w = a.w + b;
return res;
}
/** @hide
* Vector subtraction
*
* @param value
*/
public void sub(Double4 value) {
x -= value.x;
y -= value.y;
z -= value.z;
w -= value.w;
}
/** @hide
* Vector subtraction
*
* @param value
*/
public void sub(double value) {
x -= value;
y -= value;
z -= value;
w -= value;
}
/** @hide
* Vector subtraction
*
* @param a
* @param b
* @return
*/
public static Double4 sub(Double4 a, double b) {
Double4 res = new Double4();
res.x = a.x - b;
res.y = a.y - b;
res.z = a.z - b;
res.w = a.w - b;
return res;
}
/** @hide
* Vector subtraction
*
* @param a
* @param b
* @return
*/
public static Double4 sub(Double4 a, Double4 b) {
Double4 res = new Double4();
res.x = a.x - b.x;
res.y = a.y - b.y;
res.z = a.z - b.z;
res.w = a.w - b.w;
return res;
}
/** @hide
* Vector multiplication
*
* @param value
*/
public void mul(Double4 value) {
x *= value.x;
y *= value.y;
z *= value.z;
w *= value.w;
}
/** @hide
* Vector multiplication
*
* @param value
*/
public void mul(double value) {
x *= value;
y *= value;
z *= value;
w *= value;
}
/** @hide
* Vector multiplication
*
* @param a
* @param b
* @return
*/
public static Double4 mul(Double4 a, Double4 b) {
Double4 res = new Double4();
res.x = a.x * b.x;
res.y = a.y * b.y;
res.z = a.z * b.z;
res.w = a.w * b.w;
return res;
}
/** @hide
* Vector multiplication
*
* @param a
* @param b
* @return
*/
public static Double4 mul(Double4 a, double b) {
Double4 res = new Double4();
res.x = a.x * b;
res.y = a.y * b;
res.z = a.z * b;
res.w = a.w * b;
return res;
}
/** @hide
* Vector division
*
* @param value
*/
public void div(Double4 value) {
x /= value.x;
y /= value.y;
z /= value.z;
w /= value.w;
}
/** @hide
* Vector division
*
* @param value
*/
public void div(double value) {
x /= value;
y /= value;
z /= value;
w /= value;
}
/** @hide
* Vector division
*
* @param a
* @param b
* @return
*/
public static Double4 div(Double4 a, double b) {
Double4 res = new Double4();
res.x = a.x / b;
res.y = a.y / b;
res.z = a.z / b;
res.w = a.w / b;
return res;
}
/** @hide
* Vector division
*
* @param a
* @param b
* @return
*/
public static Double4 div(Double4 a, Double4 b) {
Double4 res = new Double4();
res.x = a.x / b.x;
res.y = a.y / b.y;
res.z = a.z / b.z;
res.w = a.w / b.w;
return res;
}
/** @hide
* Vector dot Product
*
* @param a
* @return
*/
public double dotProduct(Double4 a) {
return (x * a.x) + (y * a.y) + (z * a.z) + (w * a.w);
}
/** @hide
* Vector dot Product
*
* @param a
* @param b
* @return
*/
public static double dotProduct(Double4 a, Double4 b) {
return (b.x * a.x) + (b.y * a.y) + (b.z * a.z) + (b.w * a.w);
}
/** @hide
* Vector add Multiple
*
* @param a
* @param factor
*/
public void addMultiple(Double4 a, double factor) {
x += a.x * factor;
y += a.y * factor;
z += a.z * factor;
w += a.w * factor;
}
/** @hide
* Set vector value by double4
*
* @param a
*/
public void set(Double4 a) {
this.x = a.x;
this.y = a.y;
this.z = a.z;
this.w = a.w;
}
/** @hide
* Set vector negate
*/
public void negate() {
x = -x;
y = -y;
z = -z;
w = -w;
}
/** @hide
* Get vector length
*
* @return
*/
public int length() {
return 4;
}
/** @hide
* Return the element sum of vector
*
* @return
*/
public double elementSum() {
return x + y + z + w;
}
/** @hide
* Get the vector field value by index
*
* @param i
* @return
*/
public double get(int i) {
switch (i) {
case 0:
return x;
case 1:
return y;
case 2:
return z;
case 3:
return w;
default:
throw new IndexOutOfBoundsException("Index: i");
}
}
/** @hide
* Set the vector field value by index
*
* @param i
* @param value
*/
public void setAt(int i, double value) {
switch (i) {
case 0:
x = value;
return;
case 1:
y = value;
return;
case 2:
z = value;
return;
case 3:
w = value;
return;
default:
throw new IndexOutOfBoundsException("Index: i");
}
}
/** @hide
* Add the vector field value by index
*
* @param i
* @param value
*/
public void addAt(int i, double value) {
switch (i) {
case 0:
x += value;
return;
case 1:
y += value;
return;
case 2:
z += value;
return;
case 3:
w += value;
return;
default:
throw new IndexOutOfBoundsException("Index: i");
}
}
/** @hide
* Set the vector field value
*
* @param x
* @param y
* @param z
* @param w
*/
public void setValues(double x, double y, double z, double w) {
this.x = x;
this.y = y;
this.z = z;
this.w = w;
}
/** @hide
* Copy the vector to double array
*
* @param data
* @param offset
*/
public void copyTo(double[] data, int offset) {
data[offset] = x;
data[offset + 1] = y;
data[offset + 2] = z;
data[offset + 3] = w;
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,601 @@
/*
* Copyright (C) 2013 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.renderscript;
import java.util.BitSet;
/**
* Utility class for packing arguments and structures from Android system objects to
* RenderScript objects.
*
* This class is only intended to be used to support the
* reflected code generated by the RS tool chain. It should not
* be called directly.
*
**/
public class FieldPacker {
public FieldPacker(int len) {
mPos = 0;
mLen = len;
mData = new byte[len];
mAlignment = new BitSet();
}
public FieldPacker(byte[] data) {
mPos = 0;
mLen = data.length;
mData = data;
mAlignment = new BitSet();
}
public void align(int v) {
if ((v <= 0) || ((v & (v - 1)) != 0)) {
throw new RSIllegalArgumentException("argument must be a non-negative non-zero power of 2: " + v);
}
while ((mPos & (v - 1)) != 0) {
mAlignment.flip(mPos);
mData[mPos++] = 0;
}
}
public void subalign(int v) {
if ((v & (v - 1)) != 0) {
throw new RSIllegalArgumentException("argument must be a non-negative non-zero power of 2: " + v);
}
while ((mPos & (v - 1)) != 0) {
mPos--;
}
if (mPos > 0) {
while (mAlignment.get(mPos - 1) == true) {
mPos--;
mAlignment.flip(mPos);
}
}
}
public void reset() {
mPos = 0;
}
public void reset(int i) {
if ((i < 0) || (i >= mLen)) {
throw new RSIllegalArgumentException("out of range argument: " + i);
}
mPos = i;
}
public void skip(int i) {
int res = mPos + i;
if ((res < 0) || (res > mLen)) {
throw new RSIllegalArgumentException("out of range argument: " + i);
}
mPos = res;
}
public void addI8(byte v) {
mData[mPos++] = v;
}
public byte subI8() {
subalign(1);
return mData[--mPos];
}
public void addI16(short v) {
align(2);
mData[mPos++] = (byte)(v & 0xff);
mData[mPos++] = (byte)(v >> 8);
}
public short subI16() {
subalign(2);
short v = 0;
v = (short)((mData[--mPos] & 0xff) << 8);
v = (short)(v | (short)(mData[--mPos] & 0xff));
return v;
}
public void addI32(int v) {
align(4);
mData[mPos++] = (byte)(v & 0xff);
mData[mPos++] = (byte)((v >> 8) & 0xff);
mData[mPos++] = (byte)((v >> 16) & 0xff);
mData[mPos++] = (byte)((v >> 24) & 0xff);
}
public int subI32() {
subalign(4);
int v = 0;
v = ((mData[--mPos] & 0xff) << 24);
v = v | ((mData[--mPos] & 0xff) << 16);
v = v | ((mData[--mPos] & 0xff) << 8);
v = v | ((mData[--mPos] & 0xff));
return v;
}
public void addI64(long v) {
align(8);
mData[mPos++] = (byte)(v & 0xff);
mData[mPos++] = (byte)((v >> 8) & 0xff);
mData[mPos++] = (byte)((v >> 16) & 0xff);
mData[mPos++] = (byte)((v >> 24) & 0xff);
mData[mPos++] = (byte)((v >> 32) & 0xff);
mData[mPos++] = (byte)((v >> 40) & 0xff);
mData[mPos++] = (byte)((v >> 48) & 0xff);
mData[mPos++] = (byte)((v >> 56) & 0xff);
}
public long subI64() {
subalign(8);
long v = 0;
byte x = 0;
x = ((mData[--mPos]));
v = (long)(v | (((long)x) & 0xff) << 56l);
x = ((mData[--mPos]));
v = (long)(v | (((long)x) & 0xff) << 48l);
x = ((mData[--mPos]));
v = (long)(v | (((long)x) & 0xff) << 40l);
x = ((mData[--mPos]));
v = (long)(v | (((long)x) & 0xff) << 32l);
x = ((mData[--mPos]));
v = (long)(v | (((long)x) & 0xff) << 24l);
x = ((mData[--mPos]));
v = (long)(v | (((long)x) & 0xff) << 16l);
x = ((mData[--mPos]));
v = (long)(v | (((long)x) & 0xff) << 8l);
x = ((mData[--mPos]));
v = (long)(v | (((long)x) & 0xff));
return v;
}
public void addU8(short v) {
if ((v < 0) || (v > 0xff)) {
android.util.Log.e("rs", "FieldPacker.addU8( " + v + " )");
throw new IllegalArgumentException("Saving value out of range for type");
}
mData[mPos++] = (byte)v;
}
public void addU16(int v) {
if ((v < 0) || (v > 0xffff)) {
android.util.Log.e("rs", "FieldPacker.addU16( " + v + " )");
throw new IllegalArgumentException("Saving value out of range for type");
}
align(2);
mData[mPos++] = (byte)(v & 0xff);
mData[mPos++] = (byte)(v >> 8);
}
public void addU32(long v) {
if ((v < 0) || (v > 0xffffffffL)) {
android.util.Log.e("rs", "FieldPacker.addU32( " + v + " )");
throw new IllegalArgumentException("Saving value out of range for type");
}
align(4);
mData[mPos++] = (byte)(v & 0xff);
mData[mPos++] = (byte)((v >> 8) & 0xff);
mData[mPos++] = (byte)((v >> 16) & 0xff);
mData[mPos++] = (byte)((v >> 24) & 0xff);
}
public void addU64(long v) {
if (v < 0) {
android.util.Log.e("rs", "FieldPacker.addU64( " + v + " )");
throw new IllegalArgumentException("Saving value out of range for type");
}
align(8);
mData[mPos++] = (byte)(v & 0xff);
mData[mPos++] = (byte)((v >> 8) & 0xff);
mData[mPos++] = (byte)((v >> 16) & 0xff);
mData[mPos++] = (byte)((v >> 24) & 0xff);
mData[mPos++] = (byte)((v >> 32) & 0xff);
mData[mPos++] = (byte)((v >> 40) & 0xff);
mData[mPos++] = (byte)((v >> 48) & 0xff);
mData[mPos++] = (byte)((v >> 56) & 0xff);
}
public void addF32(float v) {
addI32(Float.floatToRawIntBits(v));
}
public float subF32() {
return Float.intBitsToFloat(subI32());
}
public void addF64(double v) {
addI64(Double.doubleToRawLongBits(v));
}
public double subF64() {
return Double.longBitsToDouble(subI64());
}
public void addObj(BaseObj obj) {
if (obj != null) {
// FIXME: this is fine for 32-bit but needs a path for 64-bit
addI32((int)obj.getID(null));
} else {
addI32(0);
}
}
public void addF32(Float2 v) {
addF32(v.x);
addF32(v.y);
}
public void addF32(Float3 v) {
addF32(v.x);
addF32(v.y);
addF32(v.z);
}
public void addF32(Float4 v) {
addF32(v.x);
addF32(v.y);
addF32(v.z);
addF32(v.w);
}
public void addF64(Double2 v) {
addF64(v.x);
addF64(v.y);
}
public void addF64(Double3 v) {
addF64(v.x);
addF64(v.y);
addF64(v.z);
}
public void addF64(Double4 v) {
addF64(v.x);
addF64(v.y);
addF64(v.z);
addF64(v.w);
}
public void addI8(Byte2 v) {
addI8(v.x);
addI8(v.y);
}
public void addI8(Byte3 v) {
addI8(v.x);
addI8(v.y);
addI8(v.z);
}
public void addI8(Byte4 v) {
addI8(v.x);
addI8(v.y);
addI8(v.z);
addI8(v.w);
}
public void addU8(Short2 v) {
addU8(v.x);
addU8(v.y);
}
public void addU8(Short3 v) {
addU8(v.x);
addU8(v.y);
addU8(v.z);
}
public void addU8(Short4 v) {
addU8(v.x);
addU8(v.y);
addU8(v.z);
addU8(v.w);
}
public void addI16(Short2 v) {
addI16(v.x);
addI16(v.y);
}
public void addI16(Short3 v) {
addI16(v.x);
addI16(v.y);
addI16(v.z);
}
public void addI16(Short4 v) {
addI16(v.x);
addI16(v.y);
addI16(v.z);
addI16(v.w);
}
public void addU16(Int2 v) {
addU16(v.x);
addU16(v.y);
}
public void addU16(Int3 v) {
addU16(v.x);
addU16(v.y);
addU16(v.z);
}
public void addU16(Int4 v) {
addU16(v.x);
addU16(v.y);
addU16(v.z);
addU16(v.w);
}
public void addI32(Int2 v) {
addI32(v.x);
addI32(v.y);
}
public void addI32(Int3 v) {
addI32(v.x);
addI32(v.y);
addI32(v.z);
}
public void addI32(Int4 v) {
addI32(v.x);
addI32(v.y);
addI32(v.z);
addI32(v.w);
}
public void addU32(Long2 v) {
addU32(v.x);
addU32(v.y);
}
public void addU32(Long3 v) {
addU32(v.x);
addU32(v.y);
addU32(v.z);
}
public void addU32(Long4 v) {
addU32(v.x);
addU32(v.y);
addU32(v.z);
addU32(v.w);
}
public void addI64(Long2 v) {
addI64(v.x);
addI64(v.y);
}
public void addI64(Long3 v) {
addI64(v.x);
addI64(v.y);
addI64(v.z);
}
public void addI64(Long4 v) {
addI64(v.x);
addI64(v.y);
addI64(v.z);
addI64(v.w);
}
public void addU64(Long2 v) {
addU64(v.x);
addU64(v.y);
}
public void addU64(Long3 v) {
addU64(v.x);
addU64(v.y);
addU64(v.z);
}
public void addU64(Long4 v) {
addU64(v.x);
addU64(v.y);
addU64(v.z);
addU64(v.w);
}
public Float2 subFloat2() {
Float2 v = new Float2();
v.y = subF32();
v.x = subF32();
return v;
}
public Float3 subFloat3() {
Float3 v = new Float3();
v.z = subF32();
v.y = subF32();
v.x = subF32();
return v;
}
public Float4 subFloat4() {
Float4 v = new Float4();
v.w = subF32();
v.z = subF32();
v.y = subF32();
v.x = subF32();
return v;
}
public Double2 subDouble2() {
Double2 v = new Double2();
v.y = subF64();
v.x = subF64();
return v;
}
public Double3 subDouble3() {
Double3 v = new Double3();
v.z = subF64();
v.y = subF64();
v.x = subF64();
return v;
}
public Double4 subDouble4() {
Double4 v = new Double4();
v.w = subF64();
v.z = subF64();
v.y = subF64();
v.x = subF64();
return v;
}
public Byte2 subByte2() {
Byte2 v = new Byte2();
v.y = subI8();
v.x = subI8();
return v;
}
public Byte3 subByte3() {
Byte3 v = new Byte3();
v.z = subI8();
v.y = subI8();
v.x = subI8();
return v;
}
public Byte4 subByte4() {
Byte4 v = new Byte4();
v.w = subI8();
v.z = subI8();
v.y = subI8();
v.x = subI8();
return v;
}
public Short2 subShort2() {
Short2 v = new Short2();
v.y = subI16();
v.x = subI16();
return v;
}
public Short3 subShort3() {
Short3 v = new Short3();
v.z = subI16();
v.y = subI16();
v.x = subI16();
return v;
}
public Short4 subShort4() {
Short4 v = new Short4();
v.w = subI16();
v.z = subI16();
v.y = subI16();
v.x = subI16();
return v;
}
public Int2 subInt2() {
Int2 v = new Int2();
v.y = subI32();
v.x = subI32();
return v;
}
public Int3 subInt3() {
Int3 v = new Int3();
v.z = subI32();
v.y = subI32();
v.x = subI32();
return v;
}
public Int4 subInt4() {
Int4 v = new Int4();
v.w = subI32();
v.z = subI32();
v.y = subI32();
v.x = subI32();
return v;
}
public Long2 subLong2() {
Long2 v = new Long2();
v.y = subI64();
v.x = subI64();
return v;
}
public Long3 subLong3() {
Long3 v = new Long3();
v.z = subI64();
v.y = subI64();
v.x = subI64();
return v;
}
public Long4 subLong4() {
Long4 v = new Long4();
v.w = subI64();
v.z = subI64();
v.y = subI64();
v.x = subI64();
return v;
}
public void addMatrix(Matrix4f v) {
for (int i=0; i < v.mMat.length; i++) {
addF32(v.mMat[i]);
}
}
public Matrix4f subMatrix4f() {
Matrix4f v = new Matrix4f();
for (int i = v.mMat.length - 1; i >= 0; i--) {
v.mMat[i] = subF32();
}
return v;
}
public void addMatrix(Matrix3f v) {
for (int i=0; i < v.mMat.length; i++) {
addF32(v.mMat[i]);
}
}
public Matrix3f subMatrix3f() {
Matrix3f v = new Matrix3f();
for (int i = v.mMat.length - 1; i >= 0; i--) {
v.mMat[i] = subF32();
}
return v;
}
public void addMatrix(Matrix2f v) {
for (int i=0; i < v.mMat.length; i++) {
addF32(v.mMat[i]);
}
}
public Matrix2f subMatrix2f() {
Matrix2f v = new Matrix2f();
for (int i = v.mMat.length - 1; i >= 0; i--) {
v.mMat[i] = subF32();
}
return v;
}
public void addBoolean(boolean v) {
addI8((byte)(v ? 1 : 0));
}
public boolean subBoolean() {
byte v = subI8();
if (v == 1) {
return true;
}
return false;
}
public final byte[] getData() {
return mData;
}
private final byte mData[];
private int mPos;
private int mLen;
private BitSet mAlignment;
}

View File

@@ -0,0 +1,309 @@
/*
* Copyright (C) 2008-2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.renderscript;
import java.io.File;
import java.io.InputStream;
import android.content.res.AssetManager;
import android.content.res.Resources;
/**
* @hide
* @deprecated in API 16
* FileA3D allows users to load RenderScript objects from files
* or resources stored on disk. It could be used to load items
* such as 3D geometry data converted to a RenderScript format from
* content creation tools. Currently only meshes are supported
* in FileA3D.
*
* When successfully loaded, FileA3D will contain a list of
* index entries for all the objects stored inside it.
*
**/
public class FileA3D extends BaseObj {
/**
* @deprecated in API 16
* Specifies what renderscript object type is contained within
* the FileA3D IndexEntry
**/
public enum EntryType {
/**
* @deprecated in API 16
* Unknown or or invalid object, nothing will be loaded
**/
UNKNOWN (0),
/**
* @deprecated in API 16
* RenderScript Mesh object
**/
MESH (1);
int mID;
EntryType(int id) {
mID = id;
}
static EntryType toEntryType(int intID) {
return EntryType.values()[intID];
}
}
/**
* @deprecated in API 16
* IndexEntry contains information about one of the RenderScript
* objects inside the file's index. It could be used to query the
* object's type and also name and load the object itself if
* necessary.
*/
public static class IndexEntry {
RenderScript mRS;
int mIndex;
long mID;
String mName;
EntryType mEntryType;
BaseObj mLoadedObj;
/**
* @deprecated in API 16
* Returns the name of a renderscript object the index entry
* describes
*
* @return name of a renderscript object the index entry
* describes
*
*/
public String getName() {
return mName;
}
/**
* @deprecated in API 16
* Returns the type of a renderscript object the index entry
* describes
* @return type of a renderscript object the index entry
* describes
*/
public EntryType getEntryType() {
return mEntryType;
}
/**
* @deprecated in API 16
* Used to load the object described by the index entry
* @return base renderscript object described by the entry
*/
public BaseObj getObject() {
mRS.validate();
BaseObj obj = internalCreate(mRS, this);
return obj;
}
/**
* @deprecated in API 16
* Used to load the mesh described by the index entry, object
* described by the index entry must be a renderscript mesh
*
* @return renderscript mesh object described by the entry
*/
public Mesh getMesh() {
return (Mesh)getObject();
}
static synchronized BaseObj internalCreate(RenderScript rs, IndexEntry entry) {
if(entry.mLoadedObj != null) {
return entry.mLoadedObj;
}
// to be purged on cleanup
if(entry.mEntryType == EntryType.UNKNOWN) {
return null;
}
int objectID = rs.nFileA3DGetEntryByIndex(entry.mID, entry.mIndex);
if(objectID == 0) {
return null;
}
switch (entry.mEntryType) {
case MESH:
entry.mLoadedObj = new Mesh(objectID, rs);
break;
}
entry.mLoadedObj.updateFromNative();
return entry.mLoadedObj;
}
IndexEntry(RenderScript rs, int index, long id, String name, EntryType type) {
mRS = rs;
mIndex = index;
mID = id;
mName = name;
mEntryType = type;
mLoadedObj = null;
}
}
IndexEntry[] mFileEntries;
InputStream mInputStream;
FileA3D(long id, RenderScript rs, InputStream stream) {
super(id, rs);
mInputStream = stream;
}
private void initEntries() {
int numFileEntries = mRS.nFileA3DGetNumIndexEntries(getID(mRS));
if(numFileEntries <= 0) {
return;
}
mFileEntries = new IndexEntry[numFileEntries];
int[] ids = new int[numFileEntries];
String[] names = new String[numFileEntries];
mRS.nFileA3DGetIndexEntries(getID(mRS), numFileEntries, ids, names);
for(int i = 0; i < numFileEntries; i ++) {
mFileEntries[i] = new IndexEntry(mRS, i, getID(mRS), names[i], EntryType.toEntryType(ids[i]));
}
}
/**
* @deprecated in API 16
* Returns the number of objects stored inside the a3d file
*
* @return the number of objects stored inside the a3d file
*/
public int getIndexEntryCount() {
if(mFileEntries == null) {
return 0;
}
return mFileEntries.length;
}
/**
* @deprecated in API 16
* Returns an index entry from the list of all objects inside
* FileA3D
*
* @param index number of the entry from the list to return
*
* @return entry in the a3d file described by the index
*/
public IndexEntry getIndexEntry(int index) {
if(getIndexEntryCount() == 0 || index < 0 || index >= mFileEntries.length) {
return null;
}
return mFileEntries[index];
}
/**
* @deprecated in API 16
* Creates a FileA3D object from an asset stored on disk
*
* @param rs Context to which the object will belong.
* @param mgr asset manager used to load asset
* @param path location of the file to load
*
* @return a3d file containing renderscript objects
*/
static public FileA3D createFromAsset(RenderScript rs, AssetManager mgr, String path) {
rs.validate();
long fileId = rs.nFileA3DCreateFromAsset(mgr, path);
if(fileId == 0) {
throw new RSRuntimeException("Unable to create a3d file from asset " + path);
}
FileA3D fa3d = new FileA3D(fileId, rs, null);
fa3d.initEntries();
return fa3d;
}
/**
* @deprecated in API 16
* Creates a FileA3D object from a file stored on disk
*
* @param rs Context to which the object will belong.
* @param path location of the file to load
*
* @return a3d file containing renderscript objects
*/
static public FileA3D createFromFile(RenderScript rs, String path) {
long fileId = rs.nFileA3DCreateFromFile(path);
if(fileId == 0) {
throw new RSRuntimeException("Unable to create a3d file from " + path);
}
FileA3D fa3d = new FileA3D(fileId, rs, null);
fa3d.initEntries();
return fa3d;
}
/**
* @deprecated in API 16
* Creates a FileA3D object from a file stored on disk
*
* @param rs Context to which the object will belong.
* @param path location of the file to load
*
* @return a3d file containing renderscript objects
*/
static public FileA3D createFromFile(RenderScript rs, File path) {
return createFromFile(rs, path.getAbsolutePath());
}
/**
* @deprecated in API 16
* Creates a FileA3D object from an application resource
*
* @param rs Context to which the object will belong.
* @param res resource manager used for loading
* @param id resource to create FileA3D from
*
* @return a3d file containing renderscript objects
*/
static public FileA3D createFromResource(RenderScript rs, Resources res, int id) {
rs.validate();
InputStream is = null;
try {
is = res.openRawResource(id);
} catch (Exception e) {
throw new RSRuntimeException("Unable to open resource " + id);
}
long fileId = 0;
if (is instanceof AssetManager.AssetInputStream) {
int asset = ((AssetManager.AssetInputStream) is).getAssetInt();
fileId = rs.nFileA3DCreateFromAssetStream(asset);
} else {
throw new RSRuntimeException("Unsupported asset stream");
}
if(fileId == 0) {
throw new RSRuntimeException("Unable to create a3d file from resource " + id);
}
FileA3D fa3d = new FileA3D(fileId, rs, is);
fa3d.initEntries();
return fa3d;
}
}

View File

@@ -0,0 +1,384 @@
/*
* Copyright (C) 2013 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.renderscript;
/**
* Vector version of the basic float type.
* Provides two float fields packed.
*/
public class Float2 {
public float x;
public float y;
public Float2() {
}
/** @hide */
public Float2(Float2 data) {
this.x = data.x;
this.y = data.y;
}
public Float2(float x, float y) {
this.x = x;
this.y = y;
}
/** @hide
* Vector add
*
* @param a
* @param b
* @return
*/
public static Float2 add(Float2 a, Float2 b) {
Float2 res = new Float2();
res.x = a.x + b.x;
res.y = a.y + b.y;
return res;
}
/** @hide
* Vector add
*
* @param value
*/
public void add(Float2 value) {
x += value.x;
y += value.y;
}
/** @hide
* Vector add
*
* @param value
*/
public void add(float value) {
x += value;
y += value;
}
/** @hide
* Vector add
*
* @param a
* @param b
* @return
*/
public static Float2 add(Float2 a, float b) {
Float2 res = new Float2();
res.x = a.x + b;
res.y = a.y + b;
return res;
}
/** @hide
* Vector subtraction
*
* @param value
*/
public void sub(Float2 value) {
x -= value.x;
y -= value.y;
}
/** @hide
* Vector subtraction
*
* @param a
* @param b
* @return
*/
public static Float2 sub(Float2 a, Float2 b) {
Float2 res = new Float2();
res.x = a.x - b.x;
res.y = a.y - b.y;
return res;
}
/** @hide
* Vector subtraction
*
* @param value
*/
public void sub(float value) {
x -= value;
y -= value;
}
/** @hide
* Vector subtraction
*
* @param a
* @param b
* @return
*/
public static Float2 sub(Float2 a, float b) {
Float2 res = new Float2();
res.x = a.x - b;
res.y = a.y - b;
return res;
}
/** @hide
* Vector multiplication
*
* @param value
*/
public void mul(Float2 value) {
x *= value.x;
y *= value.y;
}
/** @hide
* Vector multiplication
*
* @param a
* @param b
* @return
*/
public static Float2 mul(Float2 a, Float2 b) {
Float2 res = new Float2();
res.x = a.x * b.x;
res.y = a.y * b.y;
return res;
}
/** @hide
* Vector multiplication
*
* @param value
*/
public void mul(float value) {
x *= value;
y *= value;
}
/** @hide
* Vector multiplication
*
* @param a
* @param b
* @return
*/
public static Float2 mul(Float2 a, float b) {
Float2 res = new Float2();
res.x = a.x * b;
res.y = a.y * b;
return res;
}
/** @hide
* Vector division
*
* @param value
*/
public void div(Float2 value) {
x /= value.x;
y /= value.y;
}
/** @hide
* Vector division
*
* @param a
* @param b
* @return
*/
public static Float2 div(Float2 a, Float2 b) {
Float2 res = new Float2();
res.x = a.x / b.x;
res.y = a.y / b.y;
return res;
}
/** @hide
* Vector division
*
* @param value
*/
public void div(float value) {
x /= value;
y /= value;
}
/** @hide
* Vector division
*
* @param a
* @param b
* @return
*/
public static Float2 div(Float2 a, float b) {
Float2 res = new Float2();
res.x = a.x / b;
res.y = a.y / b;
return res;
}
/** @hide
* Vector dot Product
*
* @param a
* @return
*/
public float dotProduct(Float2 a) {
return (x * a.x) + (y * a.y);
}
/** @hide
* Vector dot Product
*
* @param a
* @param b
* @return
*/
public static float dotProduct(Float2 a, Float2 b) {
return (b.x * a.x) + (b.y * a.y);
}
/** @hide
* Vector add Multiple
*
* @param a
* @param factor
*/
public void addMultiple(Float2 a, float factor) {
x += a.x * factor;
y += a.y * factor;
}
/** @hide
* set vector value by float2
*
* @param a
*/
public void set(Float2 a) {
this.x = a.x;
this.y = a.y;
}
/** @hide
* set vector negate
*/
public void negate() {
x = -x;
y = -y;
}
/** @hide
* get vector length
*
* @return
*/
public int length() {
return 2;
}
/** @hide
* return the element sum of vector
*
* @return
*/
public float elementSum() {
return x + y;
}
/** @hide
* get the vector field value by index
*
* @param i
* @return
*/
public float get(int i) {
switch (i) {
case 0:
return x;
case 1:
return y;
default:
throw new IndexOutOfBoundsException("Index: i");
}
}
/** @hide
* set the vector field value by index
*
* @param i
* @param value
*/
public void setAt(int i, float value) {
switch (i) {
case 0:
x = value;
return;
case 1:
y = value;
return;
default:
throw new IndexOutOfBoundsException("Index: i");
}
}
/** @hide
* add the vector field value by index
*
* @param i
* @param value
*/
public void addAt(int i, float value) {
switch (i) {
case 0:
x += value;
return;
case 1:
y += value;
return;
default:
throw new IndexOutOfBoundsException("Index: i");
}
}
/** @hide
* set the vector field value
*
* @param x
* @param y
*/
public void setValues(float x, float y) {
this.x = x;
this.y = y;
}
/** @hide
* copy the vector to float array
*
* @param data
* @param offset
*/
public void copyTo(float[] data, int offset) {
data[offset] = x;
data[offset + 1] = y;
}
}

View File

@@ -0,0 +1,417 @@
/*
* Copyright (C) 2013 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.renderscript;
/**
* Vector version of the basic float type.
* Provides three float fields packed.
*/
public class Float3 {
public float x;
public float y;
public float z;
public Float3() {
}
/** @hide */
public Float3(Float3 data) {
this.x = data.x;
this.y = data.y;
this.z = data.z;
}
public Float3(float x, float y, float z) {
this.x = x;
this.y = y;
this.z = z;
}
/** @hide
* Vector add
*
* @param a
* @param b
* @return
*/
public static Float3 add(Float3 a, Float3 b) {
Float3 res = new Float3();
res.x = a.x + b.x;
res.y = a.y + b.y;
res.z = a.z + b.z;
return res;
}
/** @hide
* Vector add
*
* @param value
*/
public void add(Float3 value) {
x += value.x;
y += value.y;
z += value.z;
}
/** @hide
* Vector add
*
* @param value
*/
public void add(float value) {
x += value;
y += value;
z += value;
}
/** @hide
* Vector add
*
* @param a
* @param b
* @return
*/
public static Float3 add(Float3 a, float b) {
Float3 res = new Float3();
res.x = a.x + b;
res.y = a.y + b;
res.z = a.z + b;
return res;
}
/** @hide
* Vector subtraction
*
* @param value
*/
public void sub(Float3 value) {
x -= value.x;
y -= value.y;
z -= value.z;
}
/** @hide
* Vector subtraction
*
* @param a
* @param b
* @return
*/
public static Float3 sub(Float3 a, Float3 b) {
Float3 res = new Float3();
res.x = a.x - b.x;
res.y = a.y - b.y;
res.z = a.z - b.z;
return res;
}
/** @hide
* Vector subtraction
*
* @param value
*/
public void sub(float value) {
x -= value;
y -= value;
z -= value;
}
/** @hide
* Vector subtraction
*
* @param a
* @param b
* @return
*/
public static Float3 sub(Float3 a, float b) {
Float3 res = new Float3();
res.x = a.x - b;
res.y = a.y - b;
res.z = a.z - b;
return res;
}
/** @hide
* Vector multiplication
*
* @param value
*/
public void mul(Float3 value) {
x *= value.x;
y *= value.y;
z *= value.z;
}
/** @hide
* Vector multiplication
*
* @param a
* @param b
* @return
*/
public static Float3 mul(Float3 a, Float3 b) {
Float3 res = new Float3();
res.x = a.x * b.x;
res.y = a.y * b.y;
res.z = a.z * b.z;
return res;
}
/** @hide
* Vector multiplication
*
* @param value
*/
public void mul(float value) {
x *= value;
y *= value;
z *= value;
}
/** @hide
* Vector multiplication
*
* @param a
* @param b
* @return
*/
public static Float3 mul(Float3 a, float b) {
Float3 res = new Float3();
res.x = a.x * b;
res.y = a.y * b;
res.z = a.z * b;
return res;
}
/** @hide
* Vector division
*
* @param value
*/
public void div(Float3 value) {
x /= value.x;
y /= value.y;
z /= value.z;
}
/** @hide
* Vector division
*
* @param a
* @param b
* @return
*/
public static Float3 div(Float3 a, Float3 b) {
Float3 res = new Float3();
res.x = a.x / b.x;
res.y = a.y / b.y;
res.z = a.z / b.z;
return res;
}
/** @hide
* Vector division
*
* @param value
*/
public void div(float value) {
x /= value;
y /= value;
z /= value;
}
/** @hide
* Vector division
*
* @param a
* @param b
* @return
*/
public static Float3 div(Float3 a, float b) {
Float3 res = new Float3();
res.x = a.x / b;
res.y = a.y / b;
res.z = a.z / b;
return res;
}
/** @hide
* Vector dot Product
*
* @param a
* @return
*/
public Float dotProduct(Float3 a) {
return new Float((x * a.x) + (y * a.y) + (z * a.z));
}
/** @hide
* Vector dot Product
*
* @param a
* @param b
* @return
*/
public static Float dotProduct(Float3 a, Float3 b) {
return new Float((b.x * a.x) + (b.y * a.y) + (b.z * a.z));
}
/** @hide
* Vector add Multiple
*
* @param a
* @param factor
*/
public void addMultiple(Float3 a, float factor) {
x += a.x * factor;
y += a.y * factor;
z += a.z * factor;
}
/** @hide
* set vector value by float3
*
* @param a
*/
public void set(Float3 a) {
this.x = a.x;
this.y = a.y;
this.z = a.z;
}
/** @hide
* set vector negate
*/
public void negate() {
x = -x;
y = -y;
z = -z;
}
/** @hide
* get vector length
*
* @return
*/
public int length() {
return 3;
}
/** @hide
* return the element sum of vector
*
* @return
*/
public Float elementSum() {
return new Float(x + y + z);
}
/** @hide
* get the vector field value by index
*
* @param i
* @return
*/
public float get(int i) {
switch (i) {
case 0:
return x;
case 1:
return y;
case 2:
return z;
default:
throw new IndexOutOfBoundsException("Index: i");
}
}
/** @hide
* set the vector field value by index
*
* @param i
* @param value
*/
public void setAt(int i, float value) {
switch (i) {
case 0:
x = value;
return;
case 1:
y = value;
return;
case 2:
z = value;
return;
default:
throw new IndexOutOfBoundsException("Index: i");
}
}
/** @hide
* add the vector field value by index
*
* @param i
* @param value
*/
public void addAt(int i, float value) {
switch (i) {
case 0:
x += value;
return;
case 1:
y += value;
return;
case 2:
z += value;
return;
default:
throw new IndexOutOfBoundsException("Index: i");
}
}
/** @hide
* set the vector field value
*
* @param x
* @param y
* @param z
*/
public void setValues(float x, float y, float z) {
this.x = x;
this.y = y;
this.z = z;
}
/** @hide
* copy the vector to float array
*
* @param data
* @param offset
*/
public void copyTo(float[] data, int offset) {
data[offset] = x;
data[offset + 1] = y;
data[offset + 2] = z;
}
}

View File

@@ -0,0 +1,450 @@
/*
* Copyright (C) 2013 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.renderscript;
/**
* Vector version of the basic float type.
* Provides four float fields packed.
*/
public class Float4 {
public float x;
public float y;
public float z;
public float w;
public Float4() {
}
/** @hide */
public Float4(Float4 data) {
this.x = data.x;
this.y = data.y;
this.z = data.z;
this.w = data.w;
}
public Float4(float x, float y, float z, float w) {
this.x = x;
this.y = y;
this.z = z;
this.w = w;
}
/** @hide
* Vector add
*
* @param a
* @param b
* @return
*/
public static Float4 add(Float4 a, Float4 b) {
Float4 res = new Float4();
res.x = a.x + b.x;
res.y = a.y + b.y;
res.z = a.z + b.z;
res.w = a.w + b.w;
return res;
}
/** @hide
* Vector add
*
* @param value
*/
public void add(Float4 value) {
x += value.x;
y += value.y;
z += value.z;
w += value.w;
}
/** @hide
* Vector add
*
* @param value
*/
public void add(float value) {
x += value;
y += value;
z += value;
w += value;
}
/** @hide
* Vector add
*
* @param a
* @param b
* @return
*/
public static Float4 add(Float4 a, float b) {
Float4 res = new Float4();
res.x = a.x + b;
res.y = a.y + b;
res.z = a.z + b;
res.w = a.w + b;
return res;
}
/** @hide
* Vector subtraction
*
* @param value
*/
public void sub(Float4 value) {
x -= value.x;
y -= value.y;
z -= value.z;
w -= value.w;
}
/** @hide
* Vector subtraction
*
* @param value
*/
public void sub(float value) {
x -= value;
y -= value;
z -= value;
w -= value;
}
/** @hide
* Vector subtraction
*
* @param a
* @param b
* @return
*/
public static Float4 sub(Float4 a, float b) {
Float4 res = new Float4();
res.x = a.x - b;
res.y = a.y - b;
res.z = a.z - b;
res.w = a.w - b;
return res;
}
/** @hide
* Vector subtraction
*
* @param a
* @param b
* @return
*/
public static Float4 sub(Float4 a, Float4 b) {
Float4 res = new Float4();
res.x = a.x - b.x;
res.y = a.y - b.y;
res.z = a.z - b.z;
res.w = a.w - b.w;
return res;
}
/** @hide
* Vector multiplication
*
* @param value
*/
public void mul(Float4 value) {
x *= value.x;
y *= value.y;
z *= value.z;
w *= value.w;
}
/** @hide
* Vector multiplication
*
* @param value
*/
public void mul(float value) {
x *= value;
y *= value;
z *= value;
w *= value;
}
/** @hide
* Vector multiplication
*
* @param a
* @param b
* @return
*/
public static Float4 mul(Float4 a, Float4 b) {
Float4 res = new Float4();
res.x = a.x * b.x;
res.y = a.y * b.y;
res.z = a.z * b.z;
res.w = a.w * b.w;
return res;
}
/** @hide
* Vector multiplication
*
* @param a
* @param b
* @return
*/
public static Float4 mul(Float4 a, float b) {
Float4 res = new Float4();
res.x = a.x * b;
res.y = a.y * b;
res.z = a.z * b;
res.w = a.w * b;
return res;
}
/** @hide
* Vector division
*
* @param value
*/
public void div(Float4 value) {
x /= value.x;
y /= value.y;
z /= value.z;
w /= value.w;
}
/** @hide
* Vector division
*
* @param value
*/
public void div(float value) {
x /= value;
y /= value;
z /= value;
w /= value;
}
/** @hide
* Vector division
*
* @param a
* @param b
* @return
*/
public static Float4 div(Float4 a, float b) {
Float4 res = new Float4();
res.x = a.x / b;
res.y = a.y / b;
res.z = a.z / b;
res.w = a.w / b;
return res;
}
/** @hide
* Vector division
*
* @param a
* @param b
* @return
*/
public static Float4 div(Float4 a, Float4 b) {
Float4 res = new Float4();
res.x = a.x / b.x;
res.y = a.y / b.y;
res.z = a.z / b.z;
res.w = a.w / b.w;
return res;
}
/** @hide
* Vector dot Product
*
* @param a
* @return
*/
public float dotProduct(Float4 a) {
return (x * a.x) + (y * a.y) + (z * a.z) + (w * a.w);
}
/** @hide
* Vector dot Product
*
* @param a
* @param b
* @return
*/
public static float dotProduct(Float4 a, Float4 b) {
return (b.x * a.x) + (b.y * a.y) + (b.z * a.z) + (b.w * a.w);
}
/** @hide
* Vector add Multiple
*
* @param a
* @param factor
*/
public void addMultiple(Float4 a, float factor) {
x += a.x * factor;
y += a.y * factor;
z += a.z * factor;
w += a.w * factor;
}
/** @hide
* set vector value by float4
*
* @param a
*/
public void set(Float4 a) {
this.x = a.x;
this.y = a.y;
this.z = a.z;
this.w = a.w;
}
/** @hide
* set vector negate
*/
public void negate() {
x = -x;
y = -y;
z = -z;
w = -w;
}
/** @hide
* get vector length
*
* @return
*/
public int length() {
return 4;
}
/** @hide
* return the element sum of vector
*
* @return
*/
public float elementSum() {
return x + y + z + w;
}
/** @hide
* get the vector field value by index
*
* @param i
* @return
*/
public float get(int i) {
switch (i) {
case 0:
return x;
case 1:
return y;
case 2:
return z;
case 3:
return w;
default:
throw new IndexOutOfBoundsException("Index: i");
}
}
/** @hide
* set the vector field value by index
*
* @param i
* @param value
*/
public void setAt(int i, float value) {
switch (i) {
case 0:
x = value;
return;
case 1:
y = value;
return;
case 2:
z = value;
return;
case 3:
w = value;
return;
default:
throw new IndexOutOfBoundsException("Index: i");
}
}
/** @hide
* add the vector field value by index
*
* @param i
* @param value
*/
public void addAt(int i, float value) {
switch (i) {
case 0:
x += value;
return;
case 1:
y += value;
return;
case 2:
z += value;
return;
case 3:
w += value;
return;
default:
throw new IndexOutOfBoundsException("Index: i");
}
}
/** @hide
* set the vector field value
*
* @param x
* @param y
* @param z
* @param w
*/
public void setValues(float x, float y, float z, float w) {
this.x = x;
this.y = y;
this.z = z;
this.w = w;
}
/** @hide
* copy the vector to float array
*
* @param data
* @param offset
*/
public void copyTo(float[] data, int offset) {
data[offset] = x;
data[offset + 1] = y;
data[offset + 2] = z;
data[offset + 3] = w;
}
}

View File

@@ -0,0 +1,245 @@
/*
* Copyright (C) 2008-2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.renderscript;
import java.io.File;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import android.os.Environment;
import android.content.res.AssetManager;
import android.content.res.Resources;
/**
* @hide
* @deprecated in API 16
* <p>This class gives users a simple way to draw hardware accelerated text.
* Internally, the glyphs are rendered using the Freetype library and an internal cache of
* rendered glyph bitmaps is maintained. Each font object represents a combination of a typeface,
* and point size. You can create multiple font objects to represent styles such as bold or italic text,
* faces, and different font sizes. During creation, the Android system quieries device's screen DPI to
* ensure proper sizing across multiple device configurations.</p>
* <p>Fonts are rendered using screen-space positions and no state setup beyond binding a
* font to the RenderScript is required. A note of caution on performance, though the state changes
* are transparent to the user, they do happen internally, and it is more efficient to
* render large batches of text in sequence. It is also more efficient to render multiple
* characters at once instead of one by one to improve draw call batching.</p>
* <p>Font color and transparency are not part of the font object and you can freely modify
* them in the script to suit the user's rendering needs. Font colors work as a state machine.
* Every new call to draw text uses the last color set in the script.</p>
**/
public class Font extends BaseObj {
//These help us create a font by family name
private static final String[] sSansNames = {
"sans-serif", "arial", "helvetica", "tahoma", "verdana"
};
private static final String[] sSerifNames = {
"serif", "times", "times new roman", "palatino", "georgia", "baskerville",
"goudy", "fantasy", "cursive", "ITC Stone Serif"
};
private static final String[] sMonoNames = {
"monospace", "courier", "courier new", "monaco"
};
private static class FontFamily {
String[] mNames;
String mNormalFileName;
String mBoldFileName;
String mItalicFileName;
String mBoldItalicFileName;
}
private static Map<String, FontFamily> sFontFamilyMap;
/**
* @deprecated in API 16
*/
public enum Style {
/**
* @deprecated in API 16
*/
NORMAL,
/**
* @deprecated in API 16
*/
BOLD,
/**
* @deprecated in API 16
*/
ITALIC,
/**
* @deprecated in API 16
*/
BOLD_ITALIC;
}
private static void addFamilyToMap(FontFamily family) {
for(int i = 0; i < family.mNames.length; i ++) {
sFontFamilyMap.put(family.mNames[i], family);
}
}
private static void initFontFamilyMap() {
sFontFamilyMap = new HashMap<String, FontFamily>();
FontFamily sansFamily = new FontFamily();
sansFamily.mNames = sSansNames;
sansFamily.mNormalFileName = "Roboto-Regular.ttf";
sansFamily.mBoldFileName = "Roboto-Bold.ttf";
sansFamily.mItalicFileName = "Roboto-Italic.ttf";
sansFamily.mBoldItalicFileName = "Roboto-BoldItalic.ttf";
addFamilyToMap(sansFamily);
FontFamily serifFamily = new FontFamily();
serifFamily.mNames = sSerifNames;
serifFamily.mNormalFileName = "DroidSerif-Regular.ttf";
serifFamily.mBoldFileName = "DroidSerif-Bold.ttf";
serifFamily.mItalicFileName = "DroidSerif-Italic.ttf";
serifFamily.mBoldItalicFileName = "DroidSerif-BoldItalic.ttf";
addFamilyToMap(serifFamily);
FontFamily monoFamily = new FontFamily();
monoFamily.mNames = sMonoNames;
monoFamily.mNormalFileName = "DroidSansMono.ttf";
monoFamily.mBoldFileName = "DroidSansMono.ttf";
monoFamily.mItalicFileName = "DroidSansMono.ttf";
monoFamily.mBoldItalicFileName = "DroidSansMono.ttf";
addFamilyToMap(monoFamily);
}
static {
initFontFamilyMap();
}
static String getFontFileName(String familyName, Style style) {
FontFamily family = sFontFamilyMap.get(familyName);
if(family != null) {
switch(style) {
case NORMAL:
return family.mNormalFileName;
case BOLD:
return family.mBoldFileName;
case ITALIC:
return family.mItalicFileName;
case BOLD_ITALIC:
return family.mBoldItalicFileName;
}
}
// Fallback if we could not find the desired family
return "DroidSans.ttf";
}
Font(int id, RenderScript rs) {
super(id, rs);
}
/**
* @deprecated in API 16
* Takes a specific file name as an argument
*/
static public Font createFromFile(RenderScript rs, Resources res, String path, float pointSize) {
rs.validate();
int dpi = res.getDisplayMetrics().densityDpi;
int fontId = rs.nFontCreateFromFile(path, pointSize, dpi);
if(fontId == 0) {
throw new RSRuntimeException("Unable to create font from file " + path);
}
Font rsFont = new Font(fontId, rs);
return rsFont;
}
/**
* @deprecated in API 16
*/
static public Font createFromFile(RenderScript rs, Resources res, File path, float pointSize) {
return createFromFile(rs, res, path.getAbsolutePath(), pointSize);
}
/**
* @deprecated in API 16
*/
static public Font createFromAsset(RenderScript rs, Resources res, String path, float pointSize) {
rs.validate();
AssetManager mgr = res.getAssets();
int dpi = res.getDisplayMetrics().densityDpi;
int fontId = rs.nFontCreateFromAsset(mgr, path, pointSize, dpi);
if(fontId == 0) {
throw new RSRuntimeException("Unable to create font from asset " + path);
}
Font rsFont = new Font(fontId, rs);
return rsFont;
}
/**
* @deprecated in API 16
*/
static public Font createFromResource(RenderScript rs, Resources res, int id, float pointSize) {
String name = "R." + Integer.toString(id);
rs.validate();
InputStream is = null;
try {
is = res.openRawResource(id);
} catch (Exception e) {
throw new RSRuntimeException("Unable to open resource " + id);
}
int dpi = res.getDisplayMetrics().densityDpi;
int fontId = 0;
if (is instanceof AssetManager.AssetInputStream) {
int asset = ((AssetManager.AssetInputStream) is).getAssetInt();
fontId = rs.nFontCreateFromAssetStream(name, pointSize, dpi, asset);
} else {
throw new RSRuntimeException("Unsupported asset stream created");
}
if(fontId == 0) {
throw new RSRuntimeException("Unable to create font from resource " + id);
}
Font rsFont = new Font(fontId, rs);
return rsFont;
}
/**
* @deprecated in API 16
* Accepts one of the following family names as an argument
* and will attempt to produce the best match with a system font:
*
* "sans-serif" "arial" "helvetica" "tahoma" "verdana"
* "serif" "times" "times new roman" "palatino" "georgia" "baskerville"
* "goudy" "fantasy" "cursive" "ITC Stone Serif"
* "monospace" "courier" "courier new" "monaco"
*
* Returns default font if no match could be found.
*/
static public Font create(RenderScript rs, Resources res, String familyName, Style fontStyle, float pointSize) {
String fileName = getFontFileName(familyName, fontStyle);
String fontPath = Environment.getRootDirectory().getAbsolutePath();
fontPath += "/fonts/" + fileName;
return createFromFile(rs, res, fontPath, pointSize);
}
}

View File

@@ -0,0 +1,440 @@
/*
* Copyright (C) 2013 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.renderscript;
/**
* Vector version of the basic int type.
* Provides two int fields packed.
*/
public class Int2 {
public int x;
public int y;
public Int2() {
}
/** @hide */
public Int2(int i) {
this.x = this.y = i;
}
public Int2(int x, int y) {
this.x = x;
this.y = y;
}
/** @hide */
public Int2(Int2 source) {
this.x = source.x;
this.y = source.y;
}
/** @hide
* Vector add
*
* @param a
*/
public void add(Int2 a) {
this.x += a.x;
this.y += a.y;
}
/** @hide
* Vector add
*
* @param a
* @param b
* @return
*/
public static Int2 add(Int2 a, Int2 b) {
Int2 result = new Int2();
result.x = a.x + b.x;
result.y = a.y + b.y;
return result;
}
/** @hide
* Vector add
*
* @param value
*/
public void add(int value) {
x += value;
y += value;
}
/** @hide
* Vector add
*
* @param a
* @param b
* @return
*/
public static Int2 add(Int2 a, int b) {
Int2 result = new Int2();
result.x = a.x + b;
result.y = a.y + b;
return result;
}
/** @hide
* Vector subtraction
*
* @param a
*/
public void sub(Int2 a) {
this.x -= a.x;
this.y -= a.y;
}
/** @hide
* Vector subtraction
*
* @param a
* @param b
* @return
*/
public static Int2 sub(Int2 a, Int2 b) {
Int2 result = new Int2();
result.x = a.x - b.x;
result.y = a.y - b.y;
return result;
}
/** @hide
* Vector subtraction
*
* @param value
*/
public void sub(int value) {
x -= value;
y -= value;
}
/** @hide
* Vector subtraction
*
* @param a
* @param b
* @return
*/
public static Int2 sub(Int2 a, int b) {
Int2 result = new Int2();
result.x = a.x - b;
result.y = a.y - b;
return result;
}
/** @hide
* Vector multiplication
*
* @param a
*/
public void mul(Int2 a) {
this.x *= a.x;
this.y *= a.y;
}
/** @hide
* Vector multiplication
*
* @param a
* @param b
* @return
*/
public static Int2 mul(Int2 a, Int2 b) {
Int2 result = new Int2();
result.x = a.x * b.x;
result.y = a.y * b.y;
return result;
}
/** @hide
* Vector multiplication
*
* @param value
*/
public void mul(int value) {
x *= value;
y *= value;
}
/** @hide
* Vector multiplication
*
* @param a
* @param b
* @return
*/
public static Int2 mul(Int2 a, int b) {
Int2 result = new Int2();
result.x = a.x * b;
result.y = a.y * b;
return result;
}
/** @hide
* Vector division
*
* @param a
*/
public void div(Int2 a) {
this.x /= a.x;
this.y /= a.y;
}
/** @hide
* Vector division
*
* @param a
* @param b
* @return
*/
public static Int2 div(Int2 a, Int2 b) {
Int2 result = new Int2();
result.x = a.x / b.x;
result.y = a.y / b.y;
return result;
}
/** @hide
* Vector division
*
* @param value
*/
public void div(int value) {
x /= value;
y /= value;
}
/** @hide
* Vector division
*
* @param a
* @param b
* @return
*/
public static Int2 div(Int2 a, int b) {
Int2 result = new Int2();
result.x = a.x / b;
result.y = a.y / b;
return result;
}
/** @hide
* Vector Modulo
*
* @param a
*/
public void mod(Int2 a) {
this.x %= a.x;
this.y %= a.y;
}
/** @hide
* Vector Modulo
*
* @param a
* @param b
* @return
*/
public static Int2 mod(Int2 a, Int2 b) {
Int2 result = new Int2();
result.x = a.x % b.x;
result.y = a.y % b.y;
return result;
}
/** @hide
* Vector Modulo
*
* @param value
*/
public void mod(int value) {
x %= value;
y %= value;
}
/** @hide
* Vector Modulo
*
* @param a
* @param b
* @return
*/
public static Int2 mod(Int2 a, int b) {
Int2 result = new Int2();
result.x = a.x % b;
result.y = a.y % b;
return result;
}
/** @hide
* get vector length
*
* @return
*/
public int length() {
return 2;
}
/** @hide
* set vector negate
*/
public void negate() {
this.x = -x;
this.y = -y;
}
/** @hide
* Vector dot Product
*
* @param a
* @return
*/
public int dotProduct(Int2 a) {
return (int)((x * a.x) + (y * a.y));
}
/** @hide
* Vector dot Product
*
* @param a
* @param b
* @return
*/
public static int dotProduct(Int2 a, Int2 b) {
return (int)((b.x * a.x) + (b.y * a.y));
}
/** @hide
* Vector add Multiple
*
* @param a
* @param factor
*/
public void addMultiple(Int2 a, int factor) {
x += a.x * factor;
y += a.y * factor;
}
/** @hide
* set vector value by Int2
*
* @param a
*/
public void set(Int2 a) {
this.x = a.x;
this.y = a.y;
}
/** @hide
* set the vector field value by Int
*
* @param a
* @param b
*/
public void setValues(int a, int b) {
this.x = a;
this.y = b;
}
/** @hide
* return the element sum of vector
*
* @return
*/
public int elementSum() {
return (int)(x + y);
}
/** @hide
* get the vector field value by index
*
* @param i
* @return
*/
public int get(int i) {
switch (i) {
case 0:
return (int)(x);
case 1:
return (int)(y);
default:
throw new IndexOutOfBoundsException("Index: i");
}
}
/** @hide
* set the vector field value by index
*
* @param i
* @param value
*/
public void setAt(int i, int value) {
switch (i) {
case 0:
x = value;
return;
case 1:
y = value;
return;
default:
throw new IndexOutOfBoundsException("Index: i");
}
}
/** @hide
* add the vector field value by index
*
* @param i
* @param value
*/
public void addAt(int i, int value) {
switch (i) {
case 0:
x += value;
return;
case 1:
y += value;
return;
default:
throw new IndexOutOfBoundsException("Index: i");
}
}
/** @hide
* copy the vector to int array
*
* @param data
* @param offset
*/
public void copyTo(int[] data, int offset) {
data[offset] = (int)(x);
data[offset + 1] = (int)(y);
}
}

View File

@@ -0,0 +1,477 @@
/*
* Copyright (C) 2013 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.renderscript;
/**
* Vector version of the basic int type.
* Provides three int fields packed.
*/
public class Int3 {
public int x;
public int y;
public int z;
public Int3() {
}
/** @hide */
public Int3(int i) {
this.x = this.y = this.z = i;
}
public Int3(int x, int y, int z) {
this.x = x;
this.y = y;
this.z = z;
}
/** @hide */
public Int3(Int3 source) {
this.x = source.x;
this.y = source.y;
this.z = source.z;
}
/** @hide
* Vector add
*
* @param a
*/
public void add(Int3 a) {
this.x += a.x;
this.y += a.y;
this.z += a.z;
}
/** @hide
* Vector add
*
* @param a
* @param b
* @return
*/
public static Int3 add(Int3 a, Int3 b) {
Int3 result = new Int3();
result.x = a.x + b.x;
result.y = a.y + b.y;
result.z = a.z + b.z;
return result;
}
/** @hide
* Vector add
*
* @param value
*/
public void add(int value) {
x += value;
y += value;
z += value;
}
/** @hide
* Vector add
*
* @param a
* @param b
* @return
*/
public static Int3 add(Int3 a, int b) {
Int3 result = new Int3();
result.x = a.x + b;
result.y = a.y + b;
result.z = a.z + b;
return result;
}
/** @hide
* Vector subtraction
*
* @param a
*/
public void sub(Int3 a) {
this.x -= a.x;
this.y -= a.y;
this.z -= a.z;
}
/** @hide
* Vector subtraction
*
* @param a
* @param b
* @return
*/
public static Int3 sub(Int3 a, Int3 b) {
Int3 result = new Int3();
result.x = a.x - b.x;
result.y = a.y - b.y;
result.z = a.z - b.z;
return result;
}
/** @hide
* Vector subtraction
*
* @param value
*/
public void sub(int value) {
x -= value;
y -= value;
z -= value;
}
/** @hide
* Vector subtraction
*
* @param a
* @param b
* @return
*/
public static Int3 sub(Int3 a, int b) {
Int3 result = new Int3();
result.x = a.x - b;
result.y = a.y - b;
result.z = a.z - b;
return result;
}
/** @hide
* Vector multiplication
*
* @param a
*/
public void mul(Int3 a) {
this.x *= a.x;
this.y *= a.y;
this.z *= a.z;
}
/** @hide
* Vector multiplication
*
* @param a
* @param b
* @return
*/
public static Int3 mul(Int3 a, Int3 b) {
Int3 result = new Int3();
result.x = a.x * b.x;
result.y = a.y * b.y;
result.z = a.z * b.z;
return result;
}
/** @hide
* Vector multiplication
*
* @param value
*/
public void mul(int value) {
x *= value;
y *= value;
z *= value;
}
/** @hide
* Vector multiplication
*
* @param a
* @param b
* @return
*/
public static Int3 mul(Int3 a, int b) {
Int3 result = new Int3();
result.x = a.x * b;
result.y = a.y * b;
result.z = a.z * b;
return result;
}
/** @hide
* Vector division
*
* @param a
*/
public void div(Int3 a) {
this.x /= a.x;
this.y /= a.y;
this.z /= a.z;
}
/** @hide
* Vector division
*
* @param a
* @param b
* @return
*/
public static Int3 div(Int3 a, Int3 b) {
Int3 result = new Int3();
result.x = a.x / b.x;
result.y = a.y / b.y;
result.z = a.z / b.z;
return result;
}
/** @hide
* Vector division
*
* @param value
*/
public void div(int value) {
x /= value;
y /= value;
z /= value;
}
/** @hide
* Vector division
*
* @param a
* @param b
* @return
*/
public static Int3 div(Int3 a, int b) {
Int3 result = new Int3();
result.x = a.x / b;
result.y = a.y / b;
result.z = a.z / b;
return result;
}
/** @hide
* Vector Modulo
*
* @param a
*/
public void mod(Int3 a) {
this.x %= a.x;
this.y %= a.y;
this.z %= a.z;
}
/** @hide
* Vector Modulo
*
* @param a
* @param b
* @return
*/
public static Int3 mod(Int3 a, Int3 b) {
Int3 result = new Int3();
result.x = a.x % b.x;
result.y = a.y % b.y;
result.z = a.z % b.z;
return result;
}
/** @hide
* Vector Modulo
*
* @param value
*/
public void mod(int value) {
x %= value;
y %= value;
z %= value;
}
/** @hide
* Vector Modulo
*
* @param a
* @param b
* @return
*/
public static Int3 mod(Int3 a, int b) {
Int3 result = new Int3();
result.x = a.x % b;
result.y = a.y % b;
result.z = a.z % b;
return result;
}
/** @hide
* get vector length
*
* @return
*/
public int length() {
return 3;
}
/** @hide
* set vector negate
*/
public void negate() {
this.x = -x;
this.y = -y;
this.z = -z;
}
/** @hide
* Vector dot Product
*
* @param a
* @return
*/
public int dotProduct(Int3 a) {
return (int)((x * a.x) + (y * a.y) + (z * a.z));
}
/** @hide
* Vector dot Product
*
* @param a
* @param b
* @return
*/
public static int dotProduct(Int3 a, Int3 b) {
return (int)((b.x * a.x) + (b.y * a.y) + (b.z * a.z));
}
/** @hide
* Vector add Multiple
*
* @param a
* @param factor
*/
public void addMultiple(Int3 a, int factor) {
x += a.x * factor;
y += a.y * factor;
z += a.z * factor;
}
/** @hide
* set vector value by Int3
*
* @param a
*/
public void set(Int3 a) {
this.x = a.x;
this.y = a.y;
this.z = a.z;
}
/** @hide
* set the vector field value by Int
*
* @param a
* @param b
* @param c
*/
public void setValues(int a, int b, int c) {
this.x = a;
this.y = b;
this.z = c;
}
/** @hide
* return the element sum of vector
*
* @return
*/
public int elementSum() {
return (int)(x + y + z);
}
/** @hide
* get the vector field value by index
*
* @param i
* @return
*/
public int get(int i) {
switch (i) {
case 0:
return (int)(x);
case 1:
return (int)(y);
case 2:
return (int)(z);
default:
throw new IndexOutOfBoundsException("Index: i");
}
}
/** @hide
* set the vector field value by index
*
* @param i
* @param value
*/
public void setAt(int i, int value) {
switch (i) {
case 0:
x = value;
return;
case 1:
y = value;
return;
case 2:
z = value;
return;
default:
throw new IndexOutOfBoundsException("Index: i");
}
}
/** @hide
* add the vector field value by index
*
* @param i
* @param value
*/
public void addAt(int i, int value) {
switch (i) {
case 0:
x += value;
return;
case 1:
y += value;
return;
case 2:
z += value;
return;
default:
throw new IndexOutOfBoundsException("Index: i");
}
}
/** @hide
* copy the vector to int array
*
* @param data
* @param offset
*/
public void copyTo(int[] data, int offset) {
data[offset] = (int)(x);
data[offset + 1] = (int)(y);
data[offset + 2] = (int)(z);
}
}

View File

@@ -0,0 +1,514 @@
/*
* Copyright (C) 2013 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.renderscript;
/**
* Vector version of the basic int type.
* Provides four int fields packed.
*/
public class Int4 {
public int x;
public int y;
public int z;
public int w;
public Int4() {
}
/** @hide */
public Int4(int i) {
this.x = this.y = this.z = this.w = i;
}
public Int4(int x, int y, int z, int w) {
this.x = x;
this.y = y;
this.z = z;
this.w = w;
}
/** @hide */
public Int4(Int4 source) {
this.x = source.x;
this.y = source.y;
this.z = source.z;
this.w = source.w;
}
/** @hide
* Vector add
*
* @param a
*/
public void add(Int4 a) {
this.x += a.x;
this.y += a.y;
this.z += a.z;
this.w += a.w;
}
/** @hide
* Vector add
*
* @param a
* @param b
* @return
*/
public static Int4 add(Int4 a, Int4 b) {
Int4 result = new Int4();
result.x = a.x + b.x;
result.y = a.y + b.y;
result.z = a.z + b.z;
result.w = a.w + b.w;
return result;
}
/** @hide
* Vector add
*
* @param value
*/
public void add(int value) {
x += value;
y += value;
z += value;
w += value;
}
/** @hide
* Vector add
*
* @param a
* @param b
* @return
*/
public static Int4 add(Int4 a, int b) {
Int4 result = new Int4();
result.x = a.x + b;
result.y = a.y + b;
result.z = a.z + b;
result.w = a.w + b;
return result;
}
/** @hide
* Vector subtraction
*
* @param a
*/
public void sub(Int4 a) {
this.x -= a.x;
this.y -= a.y;
this.z -= a.z;
this.w -= a.w;
}
/** @hide
* Vector subtraction
*
* @param a
* @param b
* @return
*/
public static Int4 sub(Int4 a, Int4 b) {
Int4 result = new Int4();
result.x = a.x - b.x;
result.y = a.y - b.y;
result.z = a.z - b.z;
result.w = a.w - b.w;
return result;
}
/** @hide
* Vector subtraction
*
* @param value
*/
public void sub(int value) {
x -= value;
y -= value;
z -= value;
w -= value;
}
/** @hide
* Vector subtraction
*
* @param a
* @param b
* @return
*/
public static Int4 sub(Int4 a, int b) {
Int4 result = new Int4();
result.x = a.x - b;
result.y = a.y - b;
result.z = a.z - b;
result.w = a.w - b;
return result;
}
/** @hide
* Vector multiplication
*
* @param a
*/
public void mul(Int4 a) {
this.x *= a.x;
this.y *= a.y;
this.z *= a.z;
this.w *= a.w;
}
/** @hide
* Vector multiplication
*
* @param a
* @param b
* @return
*/
public static Int4 mul(Int4 a, Int4 b) {
Int4 result = new Int4();
result.x = a.x * b.x;
result.y = a.y * b.y;
result.z = a.z * b.z;
result.w = a.w * b.w;
return result;
}
/** @hide
* Vector multiplication
*
* @param value
*/
public void mul(int value) {
x *= value;
y *= value;
z *= value;
w *= value;
}
/** @hide
* Vector multiplication
*
* @param a
* @param b
* @return
*/
public static Int4 mul(Int4 a, int b) {
Int4 result = new Int4();
result.x = a.x * b;
result.y = a.y * b;
result.z = a.z * b;
result.w = a.w * b;
return result;
}
/** @hide
* Vector division
*
* @param a
*/
public void div(Int4 a) {
this.x /= a.x;
this.y /= a.y;
this.z /= a.z;
this.w /= a.w;
}
/** @hide
* Vector division
*
* @param a
* @param b
* @return
*/
public static Int4 div(Int4 a, Int4 b) {
Int4 result = new Int4();
result.x = a.x / b.x;
result.y = a.y / b.y;
result.z = a.z / b.z;
result.w = a.w / b.w;
return result;
}
/** @hide
* Vector division
*
* @param value
*/
public void div(int value) {
x /= value;
y /= value;
z /= value;
w /= value;
}
/** @hide
* Vector division
*
* @param a
* @param b
* @return
*/
public static Int4 div(Int4 a, int b) {
Int4 result = new Int4();
result.x = a.x / b;
result.y = a.y / b;
result.z = a.z / b;
result.w = a.w / b;
return result;
}
/** @hide
* Vector Modulo
*
* @param a
*/
public void mod(Int4 a) {
this.x %= a.x;
this.y %= a.y;
this.z %= a.z;
this.w %= a.w;
}
/** @hide
* Vector Modulo
*
* @param a
* @param b
* @return
*/
public static Int4 mod(Int4 a, Int4 b) {
Int4 result = new Int4();
result.x = a.x % b.x;
result.y = a.y % b.y;
result.z = a.z % b.z;
result.w = a.w % b.w;
return result;
}
/** @hide
* Vector Modulo
*
* @param value
*/
public void mod(int value) {
x %= value;
y %= value;
z %= value;
w %= value;
}
/** @hide
* Vector Modulo
*
* @param a
* @param b
* @return
*/
public static Int4 mod(Int4 a, int b) {
Int4 result = new Int4();
result.x = a.x % b;
result.y = a.y % b;
result.z = a.z % b;
result.w = a.w % b;
return result;
}
/** @hide
* get vector length
*
* @return
*/
public int length() {
return 4;
}
/** @hide
* set vector negate
*/
public void negate() {
this.x = -x;
this.y = -y;
this.z = -z;
this.w = -w;
}
/** @hide
* Vector dot Product
*
* @param a
* @return
*/
public int dotProduct(Int4 a) {
return (int)((x * a.x) + (y * a.y) + (z * a.z) + (w * a.w));
}
/** @hide
* Vector dot Product
*
* @param a
* @param b
* @return
*/
public static int dotProduct(Int4 a, Int4 b) {
return (int)((b.x * a.x) + (b.y * a.y) + (b.z * a.z) + (b.w * a.w));
}
/** @hide
* Vector add Multiple
*
* @param a
* @param factor
*/
public void addMultiple(Int4 a, int factor) {
x += a.x * factor;
y += a.y * factor;
z += a.z * factor;
w += a.w * factor;
}
/** @hide
* set vector value by Int4
*
* @param a
*/
public void set(Int4 a) {
this.x = a.x;
this.y = a.y;
this.z = a.z;
this.w = a.w;
}
/** @hide
* set the vector field value by Int
*
* @param a
* @param b
* @param c
* @param d
*/
public void setValues(int a, int b, int c, int d) {
this.x = a;
this.y = b;
this.z = c;
this.w = d;
}
/** @hide
* return the element sum of vector
*
* @return
*/
public int elementSum() {
return (int)(x + y + z + w);
}
/** @hide
* get the vector field value by index
*
* @param i
* @return
*/
public int get(int i) {
switch (i) {
case 0:
return (int)(x);
case 1:
return (int)(y);
case 2:
return (int)(z);
case 3:
return (int)(w);
default:
throw new IndexOutOfBoundsException("Index: i");
}
}
/** @hide
* set the vector field value by index
*
* @param i
* @param value
*/
public void setAt(int i, int value) {
switch (i) {
case 0:
x = value;
return;
case 1:
y = value;
return;
case 2:
z = value;
return;
case 3:
w = value;
return;
default:
throw new IndexOutOfBoundsException("Index: i");
}
}
/** @hide
* add the vector field value by index
*
* @param i
* @param value
*/
public void addAt(int i, int value) {
switch (i) {
case 0:
x += value;
return;
case 1:
y += value;
return;
case 2:
z += value;
return;
case 3:
w += value;
return;
default:
throw new IndexOutOfBoundsException("Index: i");
}
}
/** @hide
* copy the vector to int array
*
* @param data
* @param offset
*/
public void copyTo(int[] data, int offset) {
data[offset] = (int)(x);
data[offset + 1] = (int)(y);
data[offset + 2] = (int)(z);
data[offset + 3] = (int)(w);
}
}

View File

@@ -0,0 +1,440 @@
/*
* Copyright (C) 2013 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.renderscript;
/**
* Vector version of the basic long type.
* Provides two long fields packed.
*/
public class Long2 {
public long x;
public long y;
public Long2() {
}
/** @hide */
public Long2(long i) {
this.x = this.y = i;
}
public Long2(long x, long y) {
this.x = x;
this.y = y;
}
/** @hide */
public Long2(Long2 source) {
this.x = source.x;
this.y = source.y;
}
/** @hide
* Vector add
*
* @param a
*/
public void add(Long2 a) {
this.x += a.x;
this.y += a.y;
}
/** @hide
* Vector add
*
* @param a
* @param b
* @return
*/
public static Long2 add(Long2 a, Long2 b) {
Long2 result = new Long2();
result.x = a.x + b.x;
result.y = a.y + b.y;
return result;
}
/** @hide
* Vector add
*
* @param value
*/
public void add(long value) {
x += value;
y += value;
}
/** @hide
* Vector add
*
* @param a
* @param b
* @return
*/
public static Long2 add(Long2 a, long b) {
Long2 result = new Long2();
result.x = a.x + b;
result.y = a.y + b;
return result;
}
/** @hide
* Vector subtraction
*
* @param a
*/
public void sub(Long2 a) {
this.x -= a.x;
this.y -= a.y;
}
/** @hide
* Vector subtraction
*
* @param a
* @param b
* @return
*/
public static Long2 sub(Long2 a, Long2 b) {
Long2 result = new Long2();
result.x = a.x - b.x;
result.y = a.y - b.y;
return result;
}
/** @hide
* Vector subtraction
*
* @param value
*/
public void sub(long value) {
x -= value;
y -= value;
}
/** @hide
* Vector subtraction
*
* @param a
* @param b
* @return
*/
public static Long2 sub(Long2 a, long b) {
Long2 result = new Long2();
result.x = a.x - b;
result.y = a.y - b;
return result;
}
/** @hide
* Vector multiplication
*
* @param a
*/
public void mul(Long2 a) {
this.x *= a.x;
this.y *= a.y;
}
/** @hide
* Vector multiplication
*
* @param a
* @param b
* @return
*/
public static Long2 mul(Long2 a, Long2 b) {
Long2 result = new Long2();
result.x = a.x * b.x;
result.y = a.y * b.y;
return result;
}
/** @hide
* Vector multiplication
*
* @param value
*/
public void mul(long value) {
x *= value;
y *= value;
}
/** @hide
* Vector multiplication
*
* @param a
* @param b
* @return
*/
public static Long2 mul(Long2 a, long b) {
Long2 result = new Long2();
result.x = a.x * b;
result.y = a.y * b;
return result;
}
/** @hide
* Vector division
*
* @param a
*/
public void div(Long2 a) {
this.x /= a.x;
this.y /= a.y;
}
/** @hide
* Vector division
*
* @param a
* @param b
* @return
*/
public static Long2 div(Long2 a, Long2 b) {
Long2 result = new Long2();
result.x = a.x / b.x;
result.y = a.y / b.y;
return result;
}
/** @hide
* Vector division
*
* @param value
*/
public void div(long value) {
x /= value;
y /= value;
}
/** @hide
* Vector division
*
* @param a
* @param b
* @return
*/
public static Long2 div(Long2 a, long b) {
Long2 result = new Long2();
result.x = a.x / b;
result.y = a.y / b;
return result;
}
/** @hide
* Vector Modulo
*
* @param a
*/
public void mod(Long2 a) {
this.x %= a.x;
this.y %= a.y;
}
/** @hide
* Vector Modulo
*
* @param a
* @param b
* @return
*/
public static Long2 mod(Long2 a, Long2 b) {
Long2 result = new Long2();
result.x = a.x % b.x;
result.y = a.y % b.y;
return result;
}
/** @hide
* Vector Modulo
*
* @param value
*/
public void mod(long value) {
x %= value;
y %= value;
}
/** @hide
* Vector Modulo
*
* @param a
* @param b
* @return
*/
public static Long2 mod(Long2 a, long b) {
Long2 result = new Long2();
result.x = a.x % b;
result.y = a.y % b;
return result;
}
/** @hide
* get vector length
*
* @return
*/
public long length() {
return 2;
}
/** @hide
* set vector negate
*/
public void negate() {
this.x = -x;
this.y = -y;
}
/** @hide
* Vector dot Product
*
* @param a
* @return
*/
public long dotProduct(Long2 a) {
return (long)((x * a.x) + (y * a.y));
}
/** @hide
* Vector dot Product
*
* @param a
* @param b
* @return
*/
public static long dotProduct(Long2 a, Long2 b) {
return (long)((b.x * a.x) + (b.y * a.y));
}
/** @hide
* Vector add Multiple
*
* @param a
* @param factor
*/
public void addMultiple(Long2 a, long factor) {
x += a.x * factor;
y += a.y * factor;
}
/** @hide
* set vector value by Long2
*
* @param a
*/
public void set(Long2 a) {
this.x = a.x;
this.y = a.y;
}
/** @hide
* set the vector field value by Long
*
* @param a
* @param b
*/
public void setValues(long a, long b) {
this.x = a;
this.y = b;
}
/** @hide
* return the element sum of vector
*
* @return
*/
public long elementSum() {
return (long)(x + y);
}
/** @hide
* get the vector field value by index
*
* @param i
* @return
*/
public long get(int i) {
switch (i) {
case 0:
return (long)(x);
case 1:
return (long)(y);
default:
throw new IndexOutOfBoundsException("Index: i");
}
}
/** @hide
* set the vector field value by index
*
* @param i
* @param value
*/
public void setAt(int i, long value) {
switch (i) {
case 0:
x = value;
return;
case 1:
y = value;
return;
default:
throw new IndexOutOfBoundsException("Index: i");
}
}
/** @hide
* add the vector field value by index
*
* @param i
* @param value
*/
public void addAt(int i, long value) {
switch (i) {
case 0:
x += value;
return;
case 1:
y += value;
return;
default:
throw new IndexOutOfBoundsException("Index: i");
}
}
/** @hide
* copy the vector to long array
*
* @param data
* @param offset
*/
public void copyTo(long[] data, int offset) {
data[offset] = (long)(x);
data[offset + 1] = (long)(y);
}
}

View File

@@ -0,0 +1,477 @@
/*
* Copyright (C) 2013 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.renderscript;
/**
* Vector version of the basic long type.
* Provides three long fields packed.
*/
public class Long3 {
public long x;
public long y;
public long z;
public Long3() {
}
/** @hide */
public Long3(long i) {
this.x = this.y = this.z = i;
}
public Long3(long x, long y, long z) {
this.x = x;
this.y = y;
this.z = z;
}
/** @hide */
public Long3(Long3 source) {
this.x = source.x;
this.y = source.y;
this.z = source.z;
}
/** @hide
* Vector add
*
* @param a
*/
public void add(Long3 a) {
this.x += a.x;
this.y += a.y;
this.z += a.z;
}
/** @hide
* Vector add
*
* @param a
* @param b
* @return
*/
public static Long3 add(Long3 a, Long3 b) {
Long3 result = new Long3();
result.x = a.x + b.x;
result.y = a.y + b.y;
result.z = a.z + b.z;
return result;
}
/** @hide
* Vector add
*
* @param value
*/
public void add(long value) {
x += value;
y += value;
z += value;
}
/** @hide
* Vector add
*
* @param a
* @param b
* @return
*/
public static Long3 add(Long3 a, long b) {
Long3 result = new Long3();
result.x = a.x + b;
result.y = a.y + b;
result.z = a.z + b;
return result;
}
/** @hide
* Vector subtraction
*
* @param a
*/
public void sub(Long3 a) {
this.x -= a.x;
this.y -= a.y;
this.z -= a.z;
}
/** @hide
* Vector subtraction
*
* @param a
* @param b
* @return
*/
public static Long3 sub(Long3 a, Long3 b) {
Long3 result = new Long3();
result.x = a.x - b.x;
result.y = a.y - b.y;
result.z = a.z - b.z;
return result;
}
/** @hide
* Vector subtraction
*
* @param value
*/
public void sub(long value) {
x -= value;
y -= value;
z -= value;
}
/** @hide
* Vector subtraction
*
* @param a
* @param b
* @return
*/
public static Long3 sub(Long3 a, long b) {
Long3 result = new Long3();
result.x = a.x - b;
result.y = a.y - b;
result.z = a.z - b;
return result;
}
/** @hide
* Vector multiplication
*
* @param a
*/
public void mul(Long3 a) {
this.x *= a.x;
this.y *= a.y;
this.z *= a.z;
}
/** @hide
* Vector multiplication
*
* @param a
* @param b
* @return
*/
public static Long3 mul(Long3 a, Long3 b) {
Long3 result = new Long3();
result.x = a.x * b.x;
result.y = a.y * b.y;
result.z = a.z * b.z;
return result;
}
/** @hide
* Vector multiplication
*
* @param value
*/
public void mul(long value) {
x *= value;
y *= value;
z *= value;
}
/** @hide
* Vector multiplication
*
* @param a
* @param b
* @return
*/
public static Long3 mul(Long3 a, long b) {
Long3 result = new Long3();
result.x = a.x * b;
result.y = a.y * b;
result.z = a.z * b;
return result;
}
/** @hide
* Vector division
*
* @param a
*/
public void div(Long3 a) {
this.x /= a.x;
this.y /= a.y;
this.z /= a.z;
}
/** @hide
* Vector division
*
* @param a
* @param b
* @return
*/
public static Long3 div(Long3 a, Long3 b) {
Long3 result = new Long3();
result.x = a.x / b.x;
result.y = a.y / b.y;
result.z = a.z / b.z;
return result;
}
/** @hide
* Vector division
*
* @param value
*/
public void div(long value) {
x /= value;
y /= value;
z /= value;
}
/** @hide
* Vector division
*
* @param a
* @param b
* @return
*/
public static Long3 div(Long3 a, long b) {
Long3 result = new Long3();
result.x = a.x / b;
result.y = a.y / b;
result.z = a.z / b;
return result;
}
/** @hide
* Vector Modulo
*
* @param a
*/
public void mod(Long3 a) {
this.x %= a.x;
this.y %= a.y;
this.z %= a.z;
}
/** @hide
* Vector Modulo
*
* @param a
* @param b
* @return
*/
public static Long3 mod(Long3 a, Long3 b) {
Long3 result = new Long3();
result.x = a.x % b.x;
result.y = a.y % b.y;
result.z = a.z % b.z;
return result;
}
/** @hide
* Vector Modulo
*
* @param value
*/
public void mod(long value) {
x %= value;
y %= value;
z %= value;
}
/** @hide
* Vector Modulo
*
* @param a
* @param b
* @return
*/
public static Long3 mod(Long3 a, long b) {
Long3 result = new Long3();
result.x = a.x % b;
result.y = a.y % b;
result.z = a.z % b;
return result;
}
/** @hide
* get vector length
*
* @return
*/
public long length() {
return 3;
}
/** @hide
* set vector negate
*/
public void negate() {
this.x = -x;
this.y = -y;
this.z = -z;
}
/** @hide
* Vector dot Product
*
* @param a
* @return
*/
public long dotProduct(Long3 a) {
return (long)((x * a.x) + (y * a.y) + (z * a.z));
}
/** @hide
* Vector dot Product
*
* @param a
* @param b
* @return
*/
public static long dotProduct(Long3 a, Long3 b) {
return (long)((b.x * a.x) + (b.y * a.y) + (b.z * a.z));
}
/** @hide
* Vector add Multiple
*
* @param a
* @param factor
*/
public void addMultiple(Long3 a, long factor) {
x += a.x * factor;
y += a.y * factor;
z += a.z * factor;
}
/** @hide
* set vector value by Long3
*
* @param a
*/
public void set(Long3 a) {
this.x = a.x;
this.y = a.y;
this.z = a.z;
}
/** @hide
* set the vector field value by Long
*
* @param a
* @param b
* @param c
*/
public void setValues(long a, long b, long c) {
this.x = a;
this.y = b;
this.z = c;
}
/** @hide
* return the element sum of vector
*
* @return
*/
public long elementSum() {
return (long)(x + y + z);
}
/** @hide
* get the vector field value by index
*
* @param i
* @return
*/
public long get(int i) {
switch (i) {
case 0:
return (long)(x);
case 1:
return (long)(y);
case 2:
return (long)(z);
default:
throw new IndexOutOfBoundsException("Index: i");
}
}
/** @hide
* set the vector field value by index
*
* @param i
* @param value
*/
public void setAt(int i, long value) {
switch (i) {
case 0:
x = value;
return;
case 1:
y = value;
return;
case 2:
z = value;
return;
default:
throw new IndexOutOfBoundsException("Index: i");
}
}
/** @hide
* add the vector field value by index
*
* @param i
* @param value
*/
public void addAt(int i, long value) {
switch (i) {
case 0:
x += value;
return;
case 1:
y += value;
return;
case 2:
z += value;
return;
default:
throw new IndexOutOfBoundsException("Index: i");
}
}
/** @hide
* copy the vector to long array
*
* @param data
* @param offset
*/
public void copyTo(long[] data, int offset) {
data[offset] = (long)(x);
data[offset + 1] = (long)(y);
data[offset + 2] = (long)(z);
}
}

View File

@@ -0,0 +1,514 @@
/*
* Copyright (C) 2013 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.renderscript;
/**
* Vector version of the basic long type.
* Provides four long fields packed.
*/
public class Long4 {
public long x;
public long y;
public long z;
public long w;
public Long4() {
}
/** @hide */
public Long4(long i) {
this.x = this.y = this.z = this.w = i;
}
public Long4(long x, long y, long z, long w) {
this.x = x;
this.y = y;
this.z = z;
this.w = w;
}
/** @hide */
public Long4(Long4 source) {
this.x = source.x;
this.y = source.y;
this.z = source.z;
this.w = source.w;
}
/** @hide
* Vector add
*
* @param a
*/
public void add(Long4 a) {
this.x += a.x;
this.y += a.y;
this.z += a.z;
this.w += a.w;
}
/** @hide
* Vector add
*
* @param a
* @param b
* @return
*/
public static Long4 add(Long4 a, Long4 b) {
Long4 result = new Long4();
result.x = a.x + b.x;
result.y = a.y + b.y;
result.z = a.z + b.z;
result.w = a.w + b.w;
return result;
}
/** @hide
* Vector add
*
* @param value
*/
public void add(long value) {
x += value;
y += value;
z += value;
w += value;
}
/** @hide
* Vector add
*
* @param a
* @param b
* @return
*/
public static Long4 add(Long4 a, long b) {
Long4 result = new Long4();
result.x = a.x + b;
result.y = a.y + b;
result.z = a.z + b;
result.w = a.w + b;
return result;
}
/** @hide
* Vector subtraction
*
* @param a
*/
public void sub(Long4 a) {
this.x -= a.x;
this.y -= a.y;
this.z -= a.z;
this.w -= a.w;
}
/** @hide
* Vector subtraction
*
* @param a
* @param b
* @return
*/
public static Long4 sub(Long4 a, Long4 b) {
Long4 result = new Long4();
result.x = a.x - b.x;
result.y = a.y - b.y;
result.z = a.z - b.z;
result.w = a.w - b.w;
return result;
}
/** @hide
* Vector subtraction
*
* @param value
*/
public void sub(long value) {
x -= value;
y -= value;
z -= value;
w -= value;
}
/** @hide
* Vector subtraction
*
* @param a
* @param b
* @return
*/
public static Long4 sub(Long4 a, long b) {
Long4 result = new Long4();
result.x = a.x - b;
result.y = a.y - b;
result.z = a.z - b;
result.w = a.w - b;
return result;
}
/** @hide
* Vector multiplication
*
* @param a
*/
public void mul(Long4 a) {
this.x *= a.x;
this.y *= a.y;
this.z *= a.z;
this.w *= a.w;
}
/** @hide
* Vector multiplication
*
* @param a
* @param b
* @return
*/
public static Long4 mul(Long4 a, Long4 b) {
Long4 result = new Long4();
result.x = a.x * b.x;
result.y = a.y * b.y;
result.z = a.z * b.z;
result.w = a.w * b.w;
return result;
}
/** @hide
* Vector multiplication
*
* @param value
*/
public void mul(long value) {
x *= value;
y *= value;
z *= value;
w *= value;
}
/** @hide
* Vector multiplication
*
* @param a
* @param b
* @return
*/
public static Long4 mul(Long4 a, long b) {
Long4 result = new Long4();
result.x = a.x * b;
result.y = a.y * b;
result.z = a.z * b;
result.w = a.w * b;
return result;
}
/** @hide
* Vector division
*
* @param a
*/
public void div(Long4 a) {
this.x /= a.x;
this.y /= a.y;
this.z /= a.z;
this.w /= a.w;
}
/** @hide
* Vector division
*
* @param a
* @param b
* @return
*/
public static Long4 div(Long4 a, Long4 b) {
Long4 result = new Long4();
result.x = a.x / b.x;
result.y = a.y / b.y;
result.z = a.z / b.z;
result.w = a.w / b.w;
return result;
}
/** @hide
* Vector division
*
* @param value
*/
public void div(long value) {
x /= value;
y /= value;
z /= value;
w /= value;
}
/** @hide
* Vector division
*
* @param a
* @param b
* @return
*/
public static Long4 div(Long4 a, long b) {
Long4 result = new Long4();
result.x = a.x / b;
result.y = a.y / b;
result.z = a.z / b;
result.w = a.w / b;
return result;
}
/** @hide
* Vector Modulo
*
* @param a
*/
public void mod(Long4 a) {
this.x %= a.x;
this.y %= a.y;
this.z %= a.z;
this.w %= a.w;
}
/** @hide
* Vector Modulo
*
* @param a
* @param b
* @return
*/
public static Long4 mod(Long4 a, Long4 b) {
Long4 result = new Long4();
result.x = a.x % b.x;
result.y = a.y % b.y;
result.z = a.z % b.z;
result.w = a.w % b.w;
return result;
}
/** @hide
* Vector Modulo
*
* @param value
*/
public void mod(long value) {
x %= value;
y %= value;
z %= value;
w %= value;
}
/** @hide
* Vector Modulo
*
* @param a
* @param b
* @return
*/
public static Long4 mod(Long4 a, long b) {
Long4 result = new Long4();
result.x = a.x % b;
result.y = a.y % b;
result.z = a.z % b;
result.w = a.w % b;
return result;
}
/** @hide
* get vector length
*
* @return
*/
public long length() {
return 4;
}
/** @hide
* set vector negate
*/
public void negate() {
this.x = -x;
this.y = -y;
this.z = -z;
this.w = -w;
}
/** @hide
* Vector dot Product
*
* @param a
* @return
*/
public long dotProduct(Long4 a) {
return (long)((x * a.x) + (y * a.y) + (z * a.z) + (w * a.w));
}
/** @hide
* Vector dot Product
*
* @param a
* @param b
* @return
*/
public static long dotProduct(Long4 a, Long4 b) {
return (long)((b.x * a.x) + (b.y * a.y) + (b.z * a.z) + (b.w * a.w));
}
/** @hide
* Vector add Multiple
*
* @param a
* @param factor
*/
public void addMultiple(Long4 a, long factor) {
x += a.x * factor;
y += a.y * factor;
z += a.z * factor;
w += a.w * factor;
}
/** @hide
* set vector value by Long4
*
* @param a
*/
public void set(Long4 a) {
this.x = a.x;
this.y = a.y;
this.z = a.z;
this.w = a.w;
}
/** @hide
* set the vector field value by Long
*
* @param a
* @param b
* @param c
* @param d
*/
public void setValues(long a, long b, long c, long d) {
this.x = a;
this.y = b;
this.z = c;
this.w = d;
}
/** @hide
* return the element sum of vector
*
* @return
*/
public long elementSum() {
return (long)(x + y + z + w);
}
/** @hide
* get the vector field value by index
*
* @param i
* @return
*/
public long get(int i) {
switch (i) {
case 0:
return (long)(x);
case 1:
return (long)(y);
case 2:
return (long)(z);
case 3:
return (long)(w);
default:
throw new IndexOutOfBoundsException("Index: i");
}
}
/** @hide
* set the vector field value by index
*
* @param i
* @param value
*/
public void setAt(int i, long value) {
switch (i) {
case 0:
x = value;
return;
case 1:
y = value;
return;
case 2:
z = value;
return;
case 3:
w = value;
return;
default:
throw new IndexOutOfBoundsException("Index: i");
}
}
/** @hide
* add the vector field value by index
*
* @param i
* @param value
*/
public void addAt(int i, long value) {
switch (i) {
case 0:
x += value;
return;
case 1:
y += value;
return;
case 2:
z += value;
return;
case 3:
w += value;
return;
default:
throw new IndexOutOfBoundsException("Index: i");
}
}
/** @hide
* copy the vector to long array
*
* @param data
* @param offset
*/
public void copyTo(Long[] data, int offset) {
data[offset] = (long)(x);
data[offset + 1] = (long)(y);
data[offset + 2] = (long)(z);
data[offset + 3] = (long)(w);
}
}

View File

@@ -0,0 +1,193 @@
/*
* Copyright (C) 2009-2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.renderscript;
/**
* Class for exposing the native RenderScript rs_matrix2x2 type back to the Android system.
*
**/
public class Matrix2f {
/**
* Creates a new identity 2x2 matrix
*/
public Matrix2f() {
mMat = new float[4];
loadIdentity();
}
/**
* Creates a new matrix and sets its values from the given
* parameter
*
* @param dataArray values to set the matrix to, must be 4
* floats long
*/
public Matrix2f(float[] dataArray) {
mMat = new float[4];
System.arraycopy(dataArray, 0, mMat, 0, mMat.length);
}
/**
* Return a reference to the internal array representing matrix
* values. Modifying this array will also change the matrix
*
* @return internal array representing the matrix
*/
public float[] getArray() {
return mMat;
}
/**
* Returns the value for a given row and column
*
* @param x column of the value to return
* @param y row of the value to return
*
* @return value in the yth row and xth column
*/
public float get(int x, int y) {
return mMat[x*2 + y];
}
/**
* Sets the value for a given row and column
*
* @param x column of the value to set
* @param y row of the value to set
*/
public void set(int x, int y, float v) {
mMat[x*2 + y] = v;
}
/**
* Sets the matrix values to identity
*/
public void loadIdentity() {
mMat[0] = 1;
mMat[1] = 0;
mMat[2] = 0;
mMat[3] = 1;
}
/**
* Sets the values of the matrix to those of the parameter
*
* @param src matrix to load the values from
*/
public void load(Matrix2f src) {
System.arraycopy(src.getArray(), 0, mMat, 0, mMat.length);
}
/**
* Sets current values to be a rotation matrix of given angle
*
* @param rot rotation angle
*/
public void loadRotate(float rot) {
float c, s;
rot *= (float)(java.lang.Math.PI / 180.0f);
c = (float)java.lang.Math.cos(rot);
s = (float)java.lang.Math.sin(rot);
mMat[0] = c;
mMat[1] = -s;
mMat[2] = s;
mMat[3] = c;
}
/**
* Sets current values to be a scale matrix of given dimensions
*
* @param x scale component x
* @param y scale component y
*/
public void loadScale(float x, float y) {
loadIdentity();
mMat[0] = x;
mMat[3] = y;
}
/**
* Sets current values to be the result of multiplying two given
* matrices
*
* @param lhs left hand side matrix
* @param rhs right hand side matrix
*/
public void loadMultiply(Matrix2f lhs, Matrix2f rhs) {
for (int i=0 ; i<2 ; i++) {
float ri0 = 0;
float ri1 = 0;
for (int j=0 ; j<2 ; j++) {
float rhs_ij = rhs.get(i,j);
ri0 += lhs.get(j,0) * rhs_ij;
ri1 += lhs.get(j,1) * rhs_ij;
}
set(i,0, ri0);
set(i,1, ri1);
}
}
/**
* Post-multiplies the current matrix by a given parameter
*
* @param rhs right hand side to multiply by
*/
public void multiply(Matrix2f rhs) {
Matrix2f tmp = new Matrix2f();
tmp.loadMultiply(this, rhs);
load(tmp);
}
/**
* Modifies the current matrix by post-multiplying it with a
* rotation matrix of given angle
*
* @param rot angle of rotation
*/
public void rotate(float rot) {
Matrix2f tmp = new Matrix2f();
tmp.loadRotate(rot);
multiply(tmp);
}
/**
* Modifies the current matrix by post-multiplying it with a
* scale matrix of given dimensions
*
* @param x scale component x
* @param y scale component y
*/
public void scale(float x, float y) {
Matrix2f tmp = new Matrix2f();
tmp.loadScale(x, y);
multiply(tmp);
}
/**
* Sets the current matrix to its transpose
*/
public void transpose() {
float temp = mMat[1];
mMat[1] = mMat[2];
mMat[2] = temp;
}
final float[] mMat;
}

View File

@@ -0,0 +1,318 @@
/*
* Copyright (C) 2009-2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.renderscript;
/**
* Class for exposing the native RenderScript rs_matrix3x3 type back to the Android system.
*
**/
public class Matrix3f {
/**
* Creates a new identity 3x3 matrix
*/
public Matrix3f() {
mMat = new float[9];
loadIdentity();
}
/**
* Creates a new matrix and sets its values from the given
* parameter
*
* @param dataArray values to set the matrix to, must be 9
* floats long
*/
public Matrix3f(float[] dataArray) {
mMat = new float[9];
System.arraycopy(dataArray, 0, mMat, 0, mMat.length);
}
/**
* Return a reference to the internal array representing matrix
* values. Modifying this array will also change the matrix
*
* @return internal array representing the matrix
*/
public float[] getArray() {
return mMat;
}
/**
* Returns the value for a given row and column
*
* @param x column of the value to return
* @param y row of the value to return
*
* @return value in the yth row and xth column
*/
public float get(int x, int y) {
return mMat[x*3 + y];
}
/**
* Sets the value for a given row and column
*
* @param x column of the value to set
* @param y row of the value to set
*/
public void set(int x, int y, float v) {
mMat[x*3 + y] = v;
}
/**
* Sets the matrix values to identity
*/
public void loadIdentity() {
mMat[0] = 1;
mMat[1] = 0;
mMat[2] = 0;
mMat[3] = 0;
mMat[4] = 1;
mMat[5] = 0;
mMat[6] = 0;
mMat[7] = 0;
mMat[8] = 1;
}
/**
* Sets the values of the matrix to those of the parameter
*
* @param src matrix to load the values from
*/
public void load(Matrix3f src) {
System.arraycopy(src.getArray(), 0, mMat, 0, mMat.length);
}
/**
* Sets current values to be a rotation matrix of certain angle
* about a given axis
*
* @param rot angle of rotation
* @param x rotation axis x
* @param y rotation axis y
* @param z rotation axis z
*/
public void loadRotate(float rot, float x, float y, float z) {
float c, s;
rot *= (float)(java.lang.Math.PI / 180.0f);
c = (float)java.lang.Math.cos(rot);
s = (float)java.lang.Math.sin(rot);
float len = (float)java.lang.Math.sqrt(x*x + y*y + z*z);
if (!(len != 1)) {
float recipLen = 1.f / len;
x *= recipLen;
y *= recipLen;
z *= recipLen;
}
float nc = 1.0f - c;
float xy = x * y;
float yz = y * z;
float zx = z * x;
float xs = x * s;
float ys = y * s;
float zs = z * s;
mMat[0] = x*x*nc + c;
mMat[3] = xy*nc - zs;
mMat[6] = zx*nc + ys;
mMat[1] = xy*nc + zs;
mMat[4] = y*y*nc + c;
mMat[7] = yz*nc - xs;
mMat[2] = zx*nc - ys;
mMat[5] = yz*nc + xs;
mMat[8] = z*z*nc + c;
}
/**
* Makes the upper 2x2 a rotation matrix of the given angle
*
* @param rot rotation angle
*/
public void loadRotate(float rot) {
loadIdentity();
float c, s;
rot *= (float)(java.lang.Math.PI / 180.0f);
c = (float)java.lang.Math.cos(rot);
s = (float)java.lang.Math.sin(rot);
mMat[0] = c;
mMat[1] = -s;
mMat[3] = s;
mMat[4] = c;
}
/**
* Makes the upper 2x2 a scale matrix of given dimensions
*
* @param x scale component x
* @param y scale component y
*/
public void loadScale(float x, float y) {
loadIdentity();
mMat[0] = x;
mMat[4] = y;
}
/**
* Sets current values to be a scale matrix of given dimensions
*
* @param x scale component x
* @param y scale component y
* @param z scale component z
*/
public void loadScale(float x, float y, float z) {
loadIdentity();
mMat[0] = x;
mMat[4] = y;
mMat[8] = z;
}
/**
* Sets current values to be a translation matrix of given
* dimensions
*
* @param x translation component x
* @param y translation component y
*/
public void loadTranslate(float x, float y) {
loadIdentity();
mMat[6] = x;
mMat[7] = y;
}
/**
* Sets current values to be the result of multiplying two given
* matrices
*
* @param lhs left hand side matrix
* @param rhs right hand side matrix
*/
public void loadMultiply(Matrix3f lhs, Matrix3f rhs) {
for (int i=0 ; i<3 ; i++) {
float ri0 = 0;
float ri1 = 0;
float ri2 = 0;
for (int j=0 ; j<3 ; j++) {
float rhs_ij = rhs.get(i,j);
ri0 += lhs.get(j,0) * rhs_ij;
ri1 += lhs.get(j,1) * rhs_ij;
ri2 += lhs.get(j,2) * rhs_ij;
}
set(i,0, ri0);
set(i,1, ri1);
set(i,2, ri2);
}
}
/**
* Post-multiplies the current matrix by a given parameter
*
* @param rhs right hand side to multiply by
*/
public void multiply(Matrix3f rhs) {
Matrix3f tmp = new Matrix3f();
tmp.loadMultiply(this, rhs);
load(tmp);
}
/**
* Modifies the current matrix by post-multiplying it with a
* rotation matrix of certain angle about a given axis
*
* @param rot angle of rotation
* @param x rotation axis x
* @param y rotation axis y
* @param z rotation axis z
*/
public void rotate(float rot, float x, float y, float z) {
Matrix3f tmp = new Matrix3f();
tmp.loadRotate(rot, x, y, z);
multiply(tmp);
}
/**
* Modifies the upper 2x2 of the current matrix by
* post-multiplying it with a rotation matrix of given angle
*
* @param rot angle of rotation
*/
public void rotate(float rot) {
Matrix3f tmp = new Matrix3f();
tmp.loadRotate(rot);
multiply(tmp);
}
/**
* Modifies the upper 2x2 of the current matrix by
* post-multiplying it with a scale matrix of given dimensions
*
* @param x scale component x
* @param y scale component y
*/
public void scale(float x, float y) {
Matrix3f tmp = new Matrix3f();
tmp.loadScale(x, y);
multiply(tmp);
}
/**
* Modifies the current matrix by post-multiplying it with a
* scale matrix of given dimensions
*
* @param x scale component x
* @param y scale component y
* @param z scale component z
*/
public void scale(float x, float y, float z) {
Matrix3f tmp = new Matrix3f();
tmp.loadScale(x, y, z);
multiply(tmp);
}
/**
* Modifies the current matrix by post-multiplying it with a
* translation matrix of given dimensions
*
* @param x translation component x
* @param y translation component y
*/
public void translate(float x, float y) {
Matrix3f tmp = new Matrix3f();
tmp.loadTranslate(x, y);
multiply(tmp);
}
/**
* Sets the current matrix to its transpose
*/
public void transpose() {
for(int i = 0; i < 2; ++i) {
for(int j = i + 1; j < 3; ++j) {
float temp = mMat[i*3 + j];
mMat[i*3 + j] = mMat[j*3 + i];
mMat[j*3 + i] = temp;
}
}
}
final float[] mMat;
}

View File

@@ -0,0 +1,493 @@
/*
* Copyright (C) 2009-2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.renderscript;
import java.lang.Math;
/**
* Class for exposing the native RenderScript rs_matrix4x4 type back to the Android system.
*
**/
public class Matrix4f {
/**
* Creates a new identity 4x4 matrix
*/
public Matrix4f() {
mMat = new float[16];
loadIdentity();
}
/**
* Creates a new matrix and sets its values from the given
* parameter
*
* @param dataArray values to set the matrix to, must be 16
* floats long
*/
public Matrix4f(float[] dataArray) {
mMat = new float[16];
System.arraycopy(dataArray, 0, mMat, 0, mMat.length);
}
/**
* Return a reference to the internal array representing matrix
* values. Modifying this array will also change the matrix
*
* @return internal array representing the matrix
*/
public float[] getArray() {
return mMat;
}
/**
* Returns the value for a given row and column
*
* @param x column of the value to return
* @param y row of the value to return
*
* @return value in the yth row and xth column
*/
public float get(int x, int y) {
return mMat[x*4 + y];
}
/**
* Sets the value for a given row and column
*
* @param x column of the value to set
* @param y row of the value to set
*/
public void set(int x, int y, float v) {
mMat[x*4 + y] = v;
}
/**
* Sets the matrix values to identity
*/
public void loadIdentity() {
mMat[0] = 1;
mMat[1] = 0;
mMat[2] = 0;
mMat[3] = 0;
mMat[4] = 0;
mMat[5] = 1;
mMat[6] = 0;
mMat[7] = 0;
mMat[8] = 0;
mMat[9] = 0;
mMat[10] = 1;
mMat[11] = 0;
mMat[12] = 0;
mMat[13] = 0;
mMat[14] = 0;
mMat[15] = 1;
}
/**
* Sets the values of the matrix to those of the parameter
*
* @param src matrix to load the values from
*/
public void load(Matrix4f src) {
System.arraycopy(src.getArray(), 0, mMat, 0, mMat.length);
}
/**
* Sets the values of the matrix to those of the parameter
*
* @param src matrix to load the values from
* @hide
*/
public void load(Matrix3f src) {
mMat[0] = src.mMat[0];
mMat[1] = src.mMat[1];
mMat[2] = src.mMat[2];
mMat[3] = 0;
mMat[4] = src.mMat[3];
mMat[5] = src.mMat[4];
mMat[6] = src.mMat[5];
mMat[7] = 0;
mMat[8] = src.mMat[6];
mMat[9] = src.mMat[7];
mMat[10] = src.mMat[8];
mMat[11] = 0;
mMat[12] = 0;
mMat[13] = 0;
mMat[14] = 0;
mMat[15] = 1;
}
/**
* Sets current values to be a rotation matrix of certain angle
* about a given axis
*
* @param rot angle of rotation
* @param x rotation axis x
* @param y rotation axis y
* @param z rotation axis z
*/
public void loadRotate(float rot, float x, float y, float z) {
float c, s;
mMat[3] = 0;
mMat[7] = 0;
mMat[11]= 0;
mMat[12]= 0;
mMat[13]= 0;
mMat[14]= 0;
mMat[15]= 1;
rot *= (float)(java.lang.Math.PI / 180.0f);
c = (float)java.lang.Math.cos(rot);
s = (float)java.lang.Math.sin(rot);
float len = (float)java.lang.Math.sqrt(x*x + y*y + z*z);
if (!(len != 1)) {
float recipLen = 1.f / len;
x *= recipLen;
y *= recipLen;
z *= recipLen;
}
float nc = 1.0f - c;
float xy = x * y;
float yz = y * z;
float zx = z * x;
float xs = x * s;
float ys = y * s;
float zs = z * s;
mMat[ 0] = x*x*nc + c;
mMat[ 4] = xy*nc - zs;
mMat[ 8] = zx*nc + ys;
mMat[ 1] = xy*nc + zs;
mMat[ 5] = y*y*nc + c;
mMat[ 9] = yz*nc - xs;
mMat[ 2] = zx*nc - ys;
mMat[ 6] = yz*nc + xs;
mMat[10] = z*z*nc + c;
}
/**
* Sets current values to be a scale matrix of given dimensions
*
* @param x scale component x
* @param y scale component y
* @param z scale component z
*/
public void loadScale(float x, float y, float z) {
loadIdentity();
mMat[0] = x;
mMat[5] = y;
mMat[10] = z;
}
/**
* Sets current values to be a translation matrix of given
* dimensions
*
* @param x translation component x
* @param y translation component y
* @param z translation component z
*/
public void loadTranslate(float x, float y, float z) {
loadIdentity();
mMat[12] = x;
mMat[13] = y;
mMat[14] = z;
}
/**
* Sets current values to be the result of multiplying two given
* matrices
*
* @param lhs left hand side matrix
* @param rhs right hand side matrix
*/
public void loadMultiply(Matrix4f lhs, Matrix4f rhs) {
for (int i=0 ; i<4 ; i++) {
float ri0 = 0;
float ri1 = 0;
float ri2 = 0;
float ri3 = 0;
for (int j=0 ; j<4 ; j++) {
float rhs_ij = rhs.get(i,j);
ri0 += lhs.get(j,0) * rhs_ij;
ri1 += lhs.get(j,1) * rhs_ij;
ri2 += lhs.get(j,2) * rhs_ij;
ri3 += lhs.get(j,3) * rhs_ij;
}
set(i,0, ri0);
set(i,1, ri1);
set(i,2, ri2);
set(i,3, ri3);
}
}
/**
* Set current values to be an orthographic projection matrix
*
* @param l location of the left vertical clipping plane
* @param r location of the right vertical clipping plane
* @param b location of the bottom horizontal clipping plane
* @param t location of the top horizontal clipping plane
* @param n location of the near clipping plane
* @param f location of the far clipping plane
*/
public void loadOrtho(float l, float r, float b, float t, float n, float f) {
loadIdentity();
mMat[0] = 2 / (r - l);
mMat[5] = 2 / (t - b);
mMat[10]= -2 / (f - n);
mMat[12]= -(r + l) / (r - l);
mMat[13]= -(t + b) / (t - b);
mMat[14]= -(f + n) / (f - n);
}
/**
* Set current values to be an orthographic projection matrix
* with the right and bottom clipping planes set to the given
* values. Left and top clipping planes are set to 0. Near and
* far are set to -1, 1 respectively
*
* @param w location of the right vertical clipping plane
* @param h location of the bottom horizontal clipping plane
*
*/
public void loadOrthoWindow(int w, int h) {
loadOrtho(0,w, h,0, -1,1);
}
/**
* Sets current values to be a perspective projection matrix
*
* @param l location of the left vertical clipping plane
* @param r location of the right vertical clipping plane
* @param b location of the bottom horizontal clipping plane
* @param t location of the top horizontal clipping plane
* @param n location of the near clipping plane, must be positive
* @param f location of the far clipping plane, must be positive
*
*/
public void loadFrustum(float l, float r, float b, float t, float n, float f) {
loadIdentity();
mMat[0] = 2 * n / (r - l);
mMat[5] = 2 * n / (t - b);
mMat[8] = (r + l) / (r - l);
mMat[9] = (t + b) / (t - b);
mMat[10]= -(f + n) / (f - n);
mMat[11]= -1;
mMat[14]= -2*f*n / (f - n);
mMat[15]= 0;
}
/**
* Sets current values to be a perspective projection matrix
*
* @param fovy vertical field of view angle in degrees
* @param aspect aspect ratio of the screen
* @param near near cliping plane, must be positive
* @param far far clipping plane, must be positive
*/
public void loadPerspective(float fovy, float aspect, float near, float far) {
float top = near * (float)Math.tan((float) (fovy * Math.PI / 360.0f));
float bottom = -top;
float left = bottom * aspect;
float right = top * aspect;
loadFrustum(left, right, bottom, top, near, far);
}
/**
* Helper function to set the current values to a perspective
* projection matrix with aspect ratio defined by the parameters
* and (near, far), (bottom, top) mapping to (-1, 1) at z = 0
*
* @param w screen width
* @param h screen height
*/
public void loadProjectionNormalized(int w, int h) {
// range -1,1 in the narrow axis at z = 0.
Matrix4f m1 = new Matrix4f();
Matrix4f m2 = new Matrix4f();
if(w > h) {
float aspect = ((float)w) / h;
m1.loadFrustum(-aspect,aspect, -1,1, 1,100);
} else {
float aspect = ((float)h) / w;
m1.loadFrustum(-1,1, -aspect,aspect, 1,100);
}
m2.loadRotate(180, 0, 1, 0);
m1.loadMultiply(m1, m2);
m2.loadScale(-2, 2, 1);
m1.loadMultiply(m1, m2);
m2.loadTranslate(0, 0, 2);
m1.loadMultiply(m1, m2);
load(m1);
}
/**
* Post-multiplies the current matrix by a given parameter
*
* @param rhs right hand side to multiply by
*/
public void multiply(Matrix4f rhs) {
Matrix4f tmp = new Matrix4f();
tmp.loadMultiply(this, rhs);
load(tmp);
}
/**
* Modifies the current matrix by post-multiplying it with a
* rotation matrix of certain angle about a given axis
*
* @param rot angle of rotation
* @param x rotation axis x
* @param y rotation axis y
* @param z rotation axis z
*/
public void rotate(float rot, float x, float y, float z) {
Matrix4f tmp = new Matrix4f();
tmp.loadRotate(rot, x, y, z);
multiply(tmp);
}
/**
* Modifies the current matrix by post-multiplying it with a
* scale matrix of given dimensions
*
* @param x scale component x
* @param y scale component y
* @param z scale component z
*/
public void scale(float x, float y, float z) {
Matrix4f tmp = new Matrix4f();
tmp.loadScale(x, y, z);
multiply(tmp);
}
/**
* Modifies the current matrix by post-multiplying it with a
* translation matrix of given dimensions
*
* @param x translation component x
* @param y translation component y
* @param z translation component z
*/
public void translate(float x, float y, float z) {
Matrix4f tmp = new Matrix4f();
tmp.loadTranslate(x, y, z);
multiply(tmp);
}
private float computeCofactor(int i, int j) {
int c0 = (i+1) % 4;
int c1 = (i+2) % 4;
int c2 = (i+3) % 4;
int r0 = (j+1) % 4;
int r1 = (j+2) % 4;
int r2 = (j+3) % 4;
float minor = (mMat[c0 + 4*r0] * (mMat[c1 + 4*r1] * mMat[c2 + 4*r2] -
mMat[c1 + 4*r2] * mMat[c2 + 4*r1]))
- (mMat[c0 + 4*r1] * (mMat[c1 + 4*r0] * mMat[c2 + 4*r2] -
mMat[c1 + 4*r2] * mMat[c2 + 4*r0]))
+ (mMat[c0 + 4*r2] * (mMat[c1 + 4*r0] * mMat[c2 + 4*r1] -
mMat[c1 + 4*r1] * mMat[c2 + 4*r0]));
float cofactor = ((i+j) & 1) != 0 ? -minor : minor;
return cofactor;
}
/**
* Sets the current matrix to its inverse
*/
public boolean inverse() {
Matrix4f result = new Matrix4f();
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
result.mMat[4*i + j] = computeCofactor(i, j);
}
}
// Dot product of 0th column of source and 0th row of result
float det = mMat[0]*result.mMat[0] + mMat[4]*result.mMat[1] +
mMat[8]*result.mMat[2] + mMat[12]*result.mMat[3];
if (Math.abs(det) < 1e-6) {
return false;
}
det = 1.0f / det;
for (int i = 0; i < 16; ++i) {
mMat[i] = result.mMat[i] * det;
}
return true;
}
/**
* Sets the current matrix to its inverse transpose
*/
public boolean inverseTranspose() {
Matrix4f result = new Matrix4f();
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
result.mMat[4*j + i] = computeCofactor(i, j);
}
}
float det = mMat[0]*result.mMat[0] + mMat[4]*result.mMat[4] +
mMat[8]*result.mMat[8] + mMat[12]*result.mMat[12];
if (Math.abs(det) < 1e-6) {
return false;
}
det = 1.0f / det;
for (int i = 0; i < 16; ++i) {
mMat[i] = result.mMat[i] * det;
}
return true;
}
/**
* Sets the current matrix to its transpose
*/
public void transpose() {
for(int i = 0; i < 3; ++i) {
for(int j = i + 1; j < 4; ++j) {
float temp = mMat[i*4 + j];
mMat[i*4 + j] = mMat[j*4 + i];
mMat[j*4 + i] = temp;
}
}
}
final float[] mMat;
}

View File

@@ -0,0 +1,828 @@
/*
* Copyright (C) 2008-2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.renderscript;
import java.util.Vector;
/**
* @hide
* @deprecated in API 16
* <p>This class is a container for geometric data displayed with
* RenderScript. Internally, a mesh is a collection of allocations that
* represent vertex data (positions, normals, texture
* coordinates) and index data such as triangles and lines. </p>
* <p>
* Vertex data could either be interleaved within one
* allocation that is provided separately, as multiple allocation
* objects, or done as a combination of both. When a
* vertex channel name matches an input in the vertex program,
* RenderScript automatically connects the two together.
* </p>
* <p>
* Parts of the mesh can be rendered with either explicit
* index sets or primitive types.
* </p>
**/
public class Mesh extends BaseObj {
/**
* @deprecated in API 16
* Describes the way mesh vertex data is interpreted when rendering
*
**/
public enum Primitive {
/**
* @deprecated in API 16
* Vertex data will be rendered as a series of points
*/
POINT (0),
/**
* @deprecated in API 16
* Vertex pairs will be rendered as lines
*/
LINE (1),
/**
* @deprecated in API 16
* Vertex data will be rendered as a connected line strip
*/
LINE_STRIP (2),
/**
* @deprecated in API 16
* Vertices will be rendered as individual triangles
*/
TRIANGLE (3),
/**
* @deprecated in API 16
* Vertices will be rendered as a connected triangle strip
* defined by the first three vertices with each additional
* triangle defined by a new vertex
*/
TRIANGLE_STRIP (4),
/**
* @deprecated in API 16
* Vertices will be rendered as a sequence of triangles that all
* share first vertex as the origin
*/
TRIANGLE_FAN (5);
int mID;
Primitive(int id) {
mID = id;
}
}
Allocation[] mVertexBuffers;
Allocation[] mIndexBuffers;
Primitive[] mPrimitives;
Mesh(long id, RenderScript rs) {
super(id, rs);
}
/**
* @deprecated in API 16
* @return number of allocations containing vertex data
*
**/
public int getVertexAllocationCount() {
if(mVertexBuffers == null) {
return 0;
}
return mVertexBuffers.length;
}
/**
* @deprecated in API 16
* @param slot index in the list of allocations to return
* @return vertex data allocation at the given index
*
**/
public Allocation getVertexAllocation(int slot) {
return mVertexBuffers[slot];
}
/**
* @deprecated in API 16
* @return number of primitives or index sets in the mesh
*
**/
public int getPrimitiveCount() {
if(mIndexBuffers == null) {
return 0;
}
return mIndexBuffers.length;
}
/**
* @deprecated in API 16
* @param slot locaton within the list of index set allocation
* @return allocation containing primtive index data or null if
* the index data is not specified explicitly
*
**/
public Allocation getIndexSetAllocation(int slot) {
return mIndexBuffers[slot];
}
/**
* @deprecated in API 16
* @param slot locaiton within the list of index set primitives
* @return index set primitive type
*
**/
public Primitive getPrimitive(int slot) {
return mPrimitives[slot];
}
@Override
void updateFromNative() {
super.updateFromNative();
int vtxCount = mRS.nMeshGetVertexBufferCount(getID(mRS));
int idxCount = mRS.nMeshGetIndexCount(getID(mRS));
int[] vtxIDs = new int[vtxCount];
int[] idxIDs = new int[idxCount];
int[] primitives = new int[idxCount];
mRS.nMeshGetVertices(getID(mRS), vtxIDs, vtxCount);
mRS.nMeshGetIndices(getID(mRS), idxIDs, primitives, idxCount);
mVertexBuffers = new Allocation[vtxCount];
mIndexBuffers = new Allocation[idxCount];
mPrimitives = new Primitive[idxCount];
for(int i = 0; i < vtxCount; i ++) {
if(vtxIDs[i] != 0) {
mVertexBuffers[i] = new Allocation(vtxIDs[i], mRS, null, Allocation.USAGE_SCRIPT);
mVertexBuffers[i].updateFromNative();
}
}
for(int i = 0; i < idxCount; i ++) {
if(idxIDs[i] != 0) {
mIndexBuffers[i] = new Allocation(idxIDs[i], mRS, null, Allocation.USAGE_SCRIPT);
mIndexBuffers[i].updateFromNative();
}
mPrimitives[i] = Primitive.values()[primitives[i]];
}
}
/**
* @deprecated in API 16
* Mesh builder object. It starts empty and requires you to
* add the types necessary to create vertex and index
* allocations.
*
*/
public static class Builder {
RenderScript mRS;
int mUsage;
class Entry {
Type t;
Element e;
int size;
Primitive prim;
int usage;
}
int mVertexTypeCount;
Entry[] mVertexTypes;
Vector mIndexTypes;
/**
* @deprecated in API 16
* Creates builder object
* @param rs Context to which the mesh will belong.
* @param usage specifies how the mesh allocations are to be
* handled, whether they need to be uploaded to a
* buffer on the gpu, maintain a cpu copy, etc
*/
public Builder(RenderScript rs, int usage) {
mRS = rs;
mUsage = usage;
mVertexTypeCount = 0;
mVertexTypes = new Entry[16];
mIndexTypes = new Vector();
}
/**
* @deprecated in API 16
* @return internal index of the last vertex buffer type added to
* builder
**/
public int getCurrentVertexTypeIndex() {
return mVertexTypeCount - 1;
}
/**
* @deprecated in API 16
* @return internal index of the last index set added to the
* builder
**/
public int getCurrentIndexSetIndex() {
return mIndexTypes.size() - 1;
}
/**
* @deprecated in API 16
* Adds a vertex data type to the builder object
*
* @param t type of the vertex data allocation to be created
*
* @return this
**/
public Builder addVertexType(Type t) throws IllegalStateException {
if (mVertexTypeCount >= mVertexTypes.length) {
throw new IllegalStateException("Max vertex types exceeded.");
}
mVertexTypes[mVertexTypeCount] = new Entry();
mVertexTypes[mVertexTypeCount].t = t;
mVertexTypes[mVertexTypeCount].e = null;
mVertexTypeCount++;
return this;
}
/**
* @deprecated in API 16
* Adds a vertex data type to the builder object
*
* @param e element describing the vertex data layout
* @param size number of elements in the buffer
*
* @return this
**/
public Builder addVertexType(Element e, int size) throws IllegalStateException {
if (mVertexTypeCount >= mVertexTypes.length) {
throw new IllegalStateException("Max vertex types exceeded.");
}
mVertexTypes[mVertexTypeCount] = new Entry();
mVertexTypes[mVertexTypeCount].t = null;
mVertexTypes[mVertexTypeCount].e = e;
mVertexTypes[mVertexTypeCount].size = size;
mVertexTypeCount++;
return this;
}
/**
* @deprecated in API 16
* Adds an index set data type to the builder object
*
* @param t type of the index set data, could be null
* @param p primitive type
*
* @return this
**/
public Builder addIndexSetType(Type t, Primitive p) {
Entry indexType = new Entry();
indexType.t = t;
indexType.e = null;
indexType.size = 0;
indexType.prim = p;
mIndexTypes.addElement(indexType);
return this;
}
/**
* @deprecated in API 16
* Adds an index set primitive type to the builder object
*
* @param p primitive type
*
* @return this
**/
public Builder addIndexSetType(Primitive p) {
Entry indexType = new Entry();
indexType.t = null;
indexType.e = null;
indexType.size = 0;
indexType.prim = p;
mIndexTypes.addElement(indexType);
return this;
}
/**
* @deprecated in API 16
* Adds an index set data type to the builder object
*
* @param e element describing the index set data layout
* @param size number of elements in the buffer
* @param p primitive type
*
* @return this
**/
public Builder addIndexSetType(Element e, int size, Primitive p) {
Entry indexType = new Entry();
indexType.t = null;
indexType.e = e;
indexType.size = size;
indexType.prim = p;
mIndexTypes.addElement(indexType);
return this;
}
Type newType(Element e, int size) {
Type.Builder tb = new Type.Builder(mRS, e);
tb.setX(size);
return tb.create();
}
/**
* @deprecated in API 16
* Create a Mesh object from the current state of the builder
*
**/
public Mesh create() {
mRS.validate();
int[] vtx = new int[mVertexTypeCount];
int[] idx = new int[mIndexTypes.size()];
int[] prim = new int[mIndexTypes.size()];
Allocation[] vertexBuffers = new Allocation[mVertexTypeCount];
Allocation[] indexBuffers = new Allocation[mIndexTypes.size()];
Primitive[] primitives = new Primitive[mIndexTypes.size()];
for(int ct = 0; ct < mVertexTypeCount; ct ++) {
Allocation alloc = null;
Entry entry = mVertexTypes[ct];
if (entry.t != null) {
alloc = Allocation.createTyped(mRS, entry.t, mUsage);
} else if(entry.e != null) {
alloc = Allocation.createSized(mRS, entry.e, entry.size, mUsage);
}
vertexBuffers[ct] = alloc;
vtx[ct] = (int)alloc.getID(mRS);
}
for(int ct = 0; ct < mIndexTypes.size(); ct ++) {
Allocation alloc = null;
Entry entry = (Entry)mIndexTypes.elementAt(ct);
if (entry.t != null) {
alloc = Allocation.createTyped(mRS, entry.t, mUsage);
} else if(entry.e != null) {
alloc = Allocation.createSized(mRS, entry.e, entry.size, mUsage);
}
long allocID = (alloc == null) ? 0 : alloc.getID(mRS);
indexBuffers[ct] = alloc;
primitives[ct] = entry.prim;
idx[ct] = (int)allocID;
prim[ct] = entry.prim.mID;
}
long id = mRS.nMeshCreate(vtx, idx, prim);
Mesh newMesh = new Mesh(id, mRS);
newMesh.mVertexBuffers = vertexBuffers;
newMesh.mIndexBuffers = indexBuffers;
newMesh.mPrimitives = primitives;
return newMesh;
}
}
/**
* @deprecated in API 16
* Mesh builder object. It starts empty and requires the user to
* add all the vertex and index allocations that comprise the
* mesh
*
*/
public static class AllocationBuilder {
RenderScript mRS;
class Entry {
Allocation a;
Primitive prim;
}
int mVertexTypeCount;
Entry[] mVertexTypes;
Vector mIndexTypes;
/**
* @deprecated in API 16
**/
public AllocationBuilder(RenderScript rs) {
mRS = rs;
mVertexTypeCount = 0;
mVertexTypes = new Entry[16];
mIndexTypes = new Vector();
}
/**
* @deprecated in API 16
* @return internal index of the last vertex buffer type added to
* builder
**/
public int getCurrentVertexTypeIndex() {
return mVertexTypeCount - 1;
}
/**
* @deprecated in API 16
* @return internal index of the last index set added to the
* builder
**/
public int getCurrentIndexSetIndex() {
return mIndexTypes.size() - 1;
}
/**
* @deprecated in API 16
* Adds an allocation containing vertex buffer data to the
* builder
*
* @param a vertex data allocation
*
* @return this
**/
public AllocationBuilder addVertexAllocation(Allocation a) throws IllegalStateException {
if (mVertexTypeCount >= mVertexTypes.length) {
throw new IllegalStateException("Max vertex types exceeded.");
}
mVertexTypes[mVertexTypeCount] = new Entry();
mVertexTypes[mVertexTypeCount].a = a;
mVertexTypeCount++;
return this;
}
/**
* @deprecated in API 16
* Adds an allocation containing index buffer data and index type
* to the builder
*
* @param a index set data allocation, could be null
* @param p index set primitive type
*
* @return this
**/
public AllocationBuilder addIndexSetAllocation(Allocation a, Primitive p) {
Entry indexType = new Entry();
indexType.a = a;
indexType.prim = p;
mIndexTypes.addElement(indexType);
return this;
}
/**
* @deprecated in API 16
* Adds an index set type to the builder
*
* @param p index set primitive type
*
* @return this
**/
public AllocationBuilder addIndexSetType(Primitive p) {
Entry indexType = new Entry();
indexType.a = null;
indexType.prim = p;
mIndexTypes.addElement(indexType);
return this;
}
/**
* @deprecated in API 16
* Create a Mesh object from the current state of the builder
*
**/
public Mesh create() {
mRS.validate();
int[] vtx = new int[mVertexTypeCount];
int[] idx = new int[mIndexTypes.size()];
int[] prim = new int[mIndexTypes.size()];
Allocation[] indexBuffers = new Allocation[mIndexTypes.size()];
Primitive[] primitives = new Primitive[mIndexTypes.size()];
Allocation[] vertexBuffers = new Allocation[mVertexTypeCount];
for(int ct = 0; ct < mVertexTypeCount; ct ++) {
Entry entry = mVertexTypes[ct];
vertexBuffers[ct] = entry.a;
vtx[ct] = (int)entry.a.getID(mRS);
}
for(int ct = 0; ct < mIndexTypes.size(); ct ++) {
Entry entry = (Entry)mIndexTypes.elementAt(ct);
long allocID = (entry.a == null) ? 0 : entry.a.getID(mRS);
indexBuffers[ct] = entry.a;
primitives[ct] = entry.prim;
idx[ct] = (int)allocID;
prim[ct] = entry.prim.mID;
}
long id = mRS.nMeshCreate(vtx, idx, prim);
Mesh newMesh = new Mesh(id, mRS);
newMesh.mVertexBuffers = vertexBuffers;
newMesh.mIndexBuffers = indexBuffers;
newMesh.mPrimitives = primitives;
return newMesh;
}
}
/**
* @deprecated in API 16
* Builder that allows creation of a mesh object point by point
* and triangle by triangle
*
**/
public static class TriangleMeshBuilder {
float mVtxData[];
int mVtxCount;
int mMaxIndex;
short mIndexData[];
int mIndexCount;
RenderScript mRS;
Element mElement;
float mNX = 0;
float mNY = 0;
float mNZ = -1;
float mS0 = 0;
float mT0 = 0;
float mR = 1;
float mG = 1;
float mB = 1;
float mA = 1;
int mVtxSize;
int mFlags;
/**
* @deprecated in API 16
**/
public static final int COLOR = 0x0001;
/**
* @deprecated in API 16
**/
public static final int NORMAL = 0x0002;
/**
* @deprecated in API 16
**/
public static final int TEXTURE_0 = 0x0100;
/**
* @deprecated in API 16
* @param rs Context to which the mesh will belong.
* @param vtxSize specifies whether the vertex is a float2 or
* float3
* @param flags bitfield that is a combination of COLOR, NORMAL,
* and TEXTURE_0 that specifies what vertex data
* channels are present in the mesh
*
**/
public TriangleMeshBuilder(RenderScript rs, int vtxSize, int flags) {
mRS = rs;
mVtxCount = 0;
mMaxIndex = 0;
mIndexCount = 0;
mVtxData = new float[128];
mIndexData = new short[128];
mVtxSize = vtxSize;
mFlags = flags;
if (vtxSize < 2 || vtxSize > 3) {
throw new IllegalArgumentException("Vertex size out of range.");
}
}
private void makeSpace(int count) {
if ((mVtxCount + count) >= mVtxData.length) {
float t[] = new float[mVtxData.length * 2];
System.arraycopy(mVtxData, 0, t, 0, mVtxData.length);
mVtxData = t;
}
}
private void latch() {
if ((mFlags & COLOR) != 0) {
makeSpace(4);
mVtxData[mVtxCount++] = mR;
mVtxData[mVtxCount++] = mG;
mVtxData[mVtxCount++] = mB;
mVtxData[mVtxCount++] = mA;
}
if ((mFlags & TEXTURE_0) != 0) {
makeSpace(2);
mVtxData[mVtxCount++] = mS0;
mVtxData[mVtxCount++] = mT0;
}
if ((mFlags & NORMAL) != 0) {
makeSpace(4);
mVtxData[mVtxCount++] = mNX;
mVtxData[mVtxCount++] = mNY;
mVtxData[mVtxCount++] = mNZ;
mVtxData[mVtxCount++] = 0.0f;
}
mMaxIndex ++;
}
/**
* @deprecated in API 16
* Adds a float2 vertex to the mesh
*
* @param x position x
* @param y position y
*
* @return this
*
**/
public TriangleMeshBuilder addVertex(float x, float y) {
if (mVtxSize != 2) {
throw new IllegalStateException("add mistmatch with declared components.");
}
makeSpace(2);
mVtxData[mVtxCount++] = x;
mVtxData[mVtxCount++] = y;
latch();
return this;
}
/**
* @deprecated in API 16
* Adds a float3 vertex to the mesh
*
* @param x position x
* @param y position y
* @param z position z
*
* @return this
*
**/
public TriangleMeshBuilder addVertex(float x, float y, float z) {
if (mVtxSize != 3) {
throw new IllegalStateException("add mistmatch with declared components.");
}
makeSpace(4);
mVtxData[mVtxCount++] = x;
mVtxData[mVtxCount++] = y;
mVtxData[mVtxCount++] = z;
mVtxData[mVtxCount++] = 1.0f;
latch();
return this;
}
/**
* @deprecated in API 16
* Sets the texture coordinate for the vertices that are added after this method call.
*
* @param s texture coordinate s
* @param t texture coordinate t
*
* @return this
**/
public TriangleMeshBuilder setTexture(float s, float t) {
if ((mFlags & TEXTURE_0) == 0) {
throw new IllegalStateException("add mistmatch with declared components.");
}
mS0 = s;
mT0 = t;
return this;
}
/**
* @deprecated in API 16
* Sets the normal vector for the vertices that are added after this method call.
*
* @param x normal vector x
* @param y normal vector y
* @param z normal vector z
*
* @return this
**/
public TriangleMeshBuilder setNormal(float x, float y, float z) {
if ((mFlags & NORMAL) == 0) {
throw new IllegalStateException("add mistmatch with declared components.");
}
mNX = x;
mNY = y;
mNZ = z;
return this;
}
/**
* @deprecated in API 16
* Sets the color for the vertices that are added after this method call.
*
* @param r red component
* @param g green component
* @param b blue component
* @param a alpha component
*
* @return this
**/
public TriangleMeshBuilder setColor(float r, float g, float b, float a) {
if ((mFlags & COLOR) == 0) {
throw new IllegalStateException("add mistmatch with declared components.");
}
mR = r;
mG = g;
mB = b;
mA = a;
return this;
}
/**
* @deprecated in API 16
* Adds a new triangle to the mesh builder
*
* @param idx1 index of the first vertex in the triangle
* @param idx2 index of the second vertex in the triangle
* @param idx3 index of the third vertex in the triangle
*
* @return this
**/
public TriangleMeshBuilder addTriangle(int idx1, int idx2, int idx3) {
if((idx1 >= mMaxIndex) || (idx1 < 0) ||
(idx2 >= mMaxIndex) || (idx2 < 0) ||
(idx3 >= mMaxIndex) || (idx3 < 0)) {
throw new IllegalStateException("Index provided greater than vertex count.");
}
if ((mIndexCount + 3) >= mIndexData.length) {
short t[] = new short[mIndexData.length * 2];
System.arraycopy(mIndexData, 0, t, 0, mIndexData.length);
mIndexData = t;
}
mIndexData[mIndexCount++] = (short)idx1;
mIndexData[mIndexCount++] = (short)idx2;
mIndexData[mIndexCount++] = (short)idx3;
return this;
}
/**
* @deprecated in API 16
* Creates the mesh object from the current state of the builder
*
* @param uploadToBufferObject specifies whether the vertex data
* is to be uploaded into the buffer
* object indicating that it's likely
* not going to be modified and
* rendered many times.
* Alternatively, it indicates the
* mesh data will be updated
* frequently and remain in script
* accessible memory
*
**/
public Mesh create(boolean uploadToBufferObject) {
Element.Builder b = new Element.Builder(mRS);
b.add(Element.createVector(mRS,
Element.DataType.FLOAT_32,
mVtxSize), "position");
if ((mFlags & COLOR) != 0) {
b.add(Element.F32_4(mRS), "color");
}
if ((mFlags & TEXTURE_0) != 0) {
b.add(Element.F32_2(mRS), "texture0");
}
if ((mFlags & NORMAL) != 0) {
b.add(Element.F32_3(mRS), "normal");
}
mElement = b.create();
int usage = Allocation.USAGE_SCRIPT;
if (uploadToBufferObject) {
usage |= Allocation.USAGE_GRAPHICS_VERTEX;
}
Builder smb = new Builder(mRS, usage);
smb.addVertexType(mElement, mMaxIndex);
smb.addIndexSetType(Element.U16(mRS), mIndexCount, Primitive.TRIANGLE);
Mesh sm = smb.create();
sm.getVertexAllocation(0).copy1DRangeFromUnchecked(0, mMaxIndex, mVtxData);
if(uploadToBufferObject) {
if (uploadToBufferObject) {
sm.getVertexAllocation(0).syncAll(Allocation.USAGE_SCRIPT);
}
}
sm.getIndexSetAllocation(0).copy1DRangeFromUnchecked(0, mIndexCount, mIndexData);
if (uploadToBufferObject) {
sm.getIndexSetAllocation(0).syncAll(Allocation.USAGE_SCRIPT);
}
return sm;
}
}
}

View File

@@ -0,0 +1,87 @@
/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.renderscript;
/**
* @hide
*
*/
public class Path extends BaseObj {
public enum Primitive {
QUADRATIC_BEZIER(0),
CUBIC_BEZIER(1);
int mID;
Primitive(int id) {
mID = id;
}
}
Allocation mVertexBuffer;
Allocation mLoopBuffer;
Primitive mPrimitive;
float mQuality;
boolean mCoverageToAlpha;
Path(long id, RenderScript rs, Primitive p, Allocation vtx, Allocation loop, float q) {
super(id, rs);
mVertexBuffer = vtx;
mLoopBuffer = loop;
mPrimitive = p;
mQuality = q;
}
public Allocation getVertexAllocation() {
return mVertexBuffer;
}
public Allocation getLoopAllocation() {
return mLoopBuffer;
}
public Primitive getPrimitive() {
return mPrimitive;
}
@Override
void updateFromNative() {
}
public static Path createStaticPath(RenderScript rs, Primitive p, float quality, Allocation vtx) {
long id = rs.nPathCreate(p.mID, false, vtx.getID(rs), 0, quality);
Path newPath = new Path(id, rs, p, null, null, quality);
return newPath;
}
public static Path createStaticPath(RenderScript rs, Primitive p, float quality, Allocation vtx, Allocation loops) {
return null;
}
public static Path createDynamicPath(RenderScript rs, Primitive p, float quality, Allocation vtx) {
return null;
}
public static Path createDynamicPath(RenderScript rs, Primitive p, float quality, Allocation vtx, Allocation loops) {
return null;
}
}

View File

@@ -0,0 +1,370 @@
/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.renderscript;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import android.content.res.Resources;
import android.util.Log;
/**
* @hide
*
* Program is a base class for all the objects that modify
* various stages of the graphics pipeline
*
**/
public class Program extends BaseObj {
static final int MAX_INPUT = 8;
static final int MAX_OUTPUT = 8;
static final int MAX_CONSTANT = 8;
static final int MAX_TEXTURE = 8;
/**
*
* TextureType specifies what textures are attached to Program
* objects
*
**/
public enum TextureType {
TEXTURE_2D (0),
TEXTURE_CUBE (1);
int mID;
TextureType(int id) {
mID = id;
}
}
enum ProgramParam {
INPUT (0),
OUTPUT (1),
CONSTANT (2),
TEXTURE_TYPE (3);
int mID;
ProgramParam(int id) {
mID = id;
}
};
Element mInputs[];
Element mOutputs[];
Type mConstants[];
TextureType mTextures[];
String mTextureNames[];
int mTextureCount;
String mShader;
Program(long id, RenderScript rs) {
super(id, rs);
}
/**
* Program object can have zero or more constant allocations
* associated with it. This method returns the total count.
* @return number of constant input types
*/
public int getConstantCount() {
return mConstants != null ? mConstants.length : 0;
}
/**
* Returns the type of the constant buffer used in the program
* object. It could be used to query internal elements or create
* an allocation to store constant data.
* @param slot index of the constant input type to return
* @return constant input type
*/
public Type getConstant(int slot) {
if (slot < 0 || slot >= mConstants.length) {
throw new IllegalArgumentException("Slot ID out of range.");
}
return mConstants[slot];
}
/**
* Returns the number of textures used in this program object
* @return number of texture inputs
*/
public int getTextureCount() {
return mTextureCount;
}
/**
* Returns the type of texture at a given slot. e.g. 2D or Cube
* @param slot index of the texture input
* @return texture input type
*/
public TextureType getTextureType(int slot) {
if ((slot < 0) || (slot >= mTextureCount)) {
throw new IllegalArgumentException("Slot ID out of range.");
}
return mTextures[slot];
}
/**
* Returns the name of the texture input at a given slot. e.g.
* tex0, diffuse, spec
* @param slot index of the texture input
* @return texture input name
*/
public String getTextureName(int slot) {
if ((slot < 0) || (slot >= mTextureCount)) {
throw new IllegalArgumentException("Slot ID out of range.");
}
return mTextureNames[slot];
}
/**
* Binds a constant buffer to be used as uniform inputs to the
* program
*
* @param a allocation containing uniform data
* @param slot index within the program's list of constant
* buffer allocations
*/
public void bindConstants(Allocation a, int slot) {
if (slot < 0 || slot >= mConstants.length) {
throw new IllegalArgumentException("Slot ID out of range.");
}
if (a != null &&
a.getType().getID(mRS) != mConstants[slot].getID(mRS)) {
throw new IllegalArgumentException("Allocation type does not match slot type.");
}
long id = a != null ? a.getID(mRS) : 0;
mRS.nProgramBindConstants(getID(mRS), slot, id);
}
/**
* Binds a texture to be used in the program
*
* @param va allocation containing texture data
* @param slot index within the program's list of textures
*
*/
public void bindTexture(Allocation va, int slot)
throws IllegalArgumentException {
mRS.validate();
if ((slot < 0) || (slot >= mTextureCount)) {
throw new IllegalArgumentException("Slot ID out of range.");
}
if (va != null && va.getType().hasFaces() &&
mTextures[slot] != TextureType.TEXTURE_CUBE) {
throw new IllegalArgumentException("Cannot bind cubemap to 2d texture slot");
}
long id = va != null ? va.getID(mRS) : 0;
mRS.nProgramBindTexture(getID(mRS), slot, id);
}
/**
* Binds an object that describes how a texture at the
* corresponding location is sampled
*
* @param vs sampler for a corresponding texture
* @param slot index within the program's list of textures to
* use the sampler on
*
*/
public void bindSampler(Sampler vs, int slot)
throws IllegalArgumentException {
mRS.validate();
if ((slot < 0) || (slot >= mTextureCount)) {
throw new IllegalArgumentException("Slot ID out of range.");
}
long id = vs != null ? vs.getID(mRS) : 0;
mRS.nProgramBindSampler(getID(mRS), slot, id);
}
public static class BaseProgramBuilder {
RenderScript mRS;
Element mInputs[];
Element mOutputs[];
Type mConstants[];
Type mTextures[];
TextureType mTextureTypes[];
String mTextureNames[];
int mInputCount;
int mOutputCount;
int mConstantCount;
int mTextureCount;
String mShader;
protected BaseProgramBuilder(RenderScript rs) {
mRS = rs;
mInputs = new Element[MAX_INPUT];
mOutputs = new Element[MAX_OUTPUT];
mConstants = new Type[MAX_CONSTANT];
mInputCount = 0;
mOutputCount = 0;
mConstantCount = 0;
mTextureCount = 0;
mTextureTypes = new TextureType[MAX_TEXTURE];
mTextureNames = new String[MAX_TEXTURE];
}
/**
* Sets the GLSL shader code to be used in the program
*
* @param s GLSL shader string
* @return self
*/
public BaseProgramBuilder setShader(String s) {
mShader = s;
return this;
}
/**
* Sets the GLSL shader code to be used in the program
*
* @param resources application resources
* @param resourceID id of the file containing GLSL shader code
*
* @return self
*/
public BaseProgramBuilder setShader(Resources resources, int resourceID) {
byte[] str;
int strLength;
InputStream is = resources.openRawResource(resourceID);
try {
try {
str = new byte[1024];
strLength = 0;
while(true) {
int bytesLeft = str.length - strLength;
if (bytesLeft == 0) {
byte[] buf2 = new byte[str.length * 2];
System.arraycopy(str, 0, buf2, 0, str.length);
str = buf2;
bytesLeft = str.length - strLength;
}
int bytesRead = is.read(str, strLength, bytesLeft);
if (bytesRead <= 0) {
break;
}
strLength += bytesRead;
}
} finally {
is.close();
}
} catch(IOException e) {
throw new Resources.NotFoundException();
}
try {
mShader = new String(str, 0, strLength, "UTF-8");
} catch (UnsupportedEncodingException e) {
Log.e("RenderScript shader creation", "Could not decode shader string");
}
return this;
}
/**
* Queries the index of the last added constant buffer type
*
*/
public int getCurrentConstantIndex() {
return mConstantCount - 1;
}
/**
* Queries the index of the last added texture type
*
*/
public int getCurrentTextureIndex() {
return mTextureCount - 1;
}
/**
* Adds constant (uniform) inputs to the program
*
* @param t Type that describes the layout of the Allocation
* object to be used as constant inputs to the Program
* @return self
*/
public BaseProgramBuilder addConstant(Type t) throws IllegalStateException {
// Should check for consistant and non-conflicting names...
if(mConstantCount >= MAX_CONSTANT) {
throw new RSIllegalArgumentException("Max input count exceeded.");
}
if (t.getElement().isComplex()) {
throw new RSIllegalArgumentException("Complex elements not allowed.");
}
mConstants[mConstantCount] = t;
mConstantCount++;
return this;
}
/**
* Adds a texture input to the Program
*
* @param texType describes that the texture to append it (2D,
* Cubemap, etc.)
* @return self
*/
public BaseProgramBuilder addTexture(TextureType texType) throws IllegalArgumentException {
addTexture(texType, "Tex" + mTextureCount);
return this;
}
/**
* Adds a texture input to the Program
*
* @param texType describes that the texture to append it (2D,
* Cubemap, etc.)
* @param texName what the texture should be called in the
* shader
* @return self
*/
public BaseProgramBuilder addTexture(TextureType texType, String texName)
throws IllegalArgumentException {
if(mTextureCount >= MAX_TEXTURE) {
throw new IllegalArgumentException("Max texture count exceeded.");
}
mTextureTypes[mTextureCount] = texType;
mTextureNames[mTextureCount] = texName;
mTextureCount ++;
return this;
}
protected void initProgram(Program p) {
p.mInputs = new Element[mInputCount];
System.arraycopy(mInputs, 0, p.mInputs, 0, mInputCount);
p.mOutputs = new Element[mOutputCount];
System.arraycopy(mOutputs, 0, p.mOutputs, 0, mOutputCount);
p.mConstants = new Type[mConstantCount];
System.arraycopy(mConstants, 0, p.mConstants, 0, mConstantCount);
p.mTextureCount = mTextureCount;
p.mTextures = new TextureType[mTextureCount];
System.arraycopy(mTextureTypes, 0, p.mTextures, 0, mTextureCount);
p.mTextureNames = new String[mTextureCount];
System.arraycopy(mTextureNames, 0, p.mTextureNames, 0, mTextureCount);
}
}
}

View File

@@ -0,0 +1,96 @@
/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.renderscript;
/**
* @hide
* @deprecated in API 16
* <p>The RenderScript fragment program, also known as fragment shader is responsible
* for manipulating pixel data in a user defined way. It's constructed from a GLSL
* shader string containing the program body, textures inputs, and a Type object
* that describes the constants used by the program. Similar to the vertex programs,
* when an allocation with constant input values is bound to the shader, its values
* are sent to the graphics program automatically.</p>
* <p> The values inside the allocation are not explicitly tracked. If they change between two draw
* calls using the same program object, the runtime needs to be notified of that
* change by calling rsgAllocationSyncAll so it could send the new values to hardware.
* Communication between the vertex and fragment programs is handled internally in the
* GLSL code. For example, if the fragment program is expecting a varying input called
* varTex0, the GLSL code inside the program vertex must provide it.
* </p>
*
**/
public class ProgramFragment extends Program {
ProgramFragment(long id, RenderScript rs) {
super(id, rs);
}
/**
* @deprecated in API 16
*/
public static class Builder extends BaseProgramBuilder {
/**
* @deprecated in API 16
* Create a builder object.
*
* @param rs Context to which the program will belong.
*/
public Builder(RenderScript rs) {
super(rs);
}
/**
* @deprecated in API 16
* Creates ProgramFragment from the current state of the builder
*
* @return ProgramFragment
*/
public ProgramFragment create() {
mRS.validate();
int[] tmp = new int[(mInputCount + mOutputCount + mConstantCount + mTextureCount) * 2];
String[] texNames = new String[mTextureCount];
int idx = 0;
for (int i=0; i < mInputCount; i++) {
tmp[idx++] = ProgramParam.INPUT.mID;
tmp[idx++] = (int)mInputs[i].getID(mRS);
}
for (int i=0; i < mOutputCount; i++) {
tmp[idx++] = ProgramParam.OUTPUT.mID;
tmp[idx++] = (int)mOutputs[i].getID(mRS);
}
for (int i=0; i < mConstantCount; i++) {
tmp[idx++] = ProgramParam.CONSTANT.mID;
tmp[idx++] = (int)mConstants[i].getID(mRS);
}
for (int i=0; i < mTextureCount; i++) {
tmp[idx++] = ProgramParam.TEXTURE_TYPE.mID;
tmp[idx++] = (int)mTextureTypes[i].mID;
texNames[i] = mTextureNames[i];
}
long id = mRS.nProgramFragmentCreate(mShader, texNames, tmp);
ProgramFragment pf = new ProgramFragment(id, mRS);
initProgram(pf);
return pf;
}
}
}

View File

@@ -0,0 +1,332 @@
/*
* Copyright (C) 2008-2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.renderscript;
/**
* @hide
* @deprecated in API 16
* <p>ProgramFragmentFixedFunction is a helper class that provides
* a way to make a simple fragment shader without writing any
* GLSL code. This class allows for display of constant color, interpolated
* color from the vertex shader, or combinations of the both
* blended with results of up to two texture lookups.</p
*
**/
public class ProgramFragmentFixedFunction extends ProgramFragment {
ProgramFragmentFixedFunction(long id, RenderScript rs) {
super(id, rs);
}
static class InternalBuilder extends BaseProgramBuilder {
/**
* @deprecated in API 16
*/
public InternalBuilder(RenderScript rs) {
super(rs);
}
/**
* @deprecated in API 16
* Creates ProgramFragmentFixedFunction from the current state
* of the builder
*
* @return ProgramFragmentFixedFunction
*/
public ProgramFragmentFixedFunction create() {
mRS.validate();
int[] tmp = new int[(mInputCount + mOutputCount + mConstantCount + mTextureCount) * 2];
String[] texNames = new String[mTextureCount];
int idx = 0;
for (int i=0; i < mInputCount; i++) {
tmp[idx++] = ProgramParam.INPUT.mID;
tmp[idx++] = (int)mInputs[i].getID(mRS);
}
for (int i=0; i < mOutputCount; i++) {
tmp[idx++] = ProgramParam.OUTPUT.mID;
tmp[idx++] = (int)mOutputs[i].getID(mRS);
}
for (int i=0; i < mConstantCount; i++) {
tmp[idx++] = ProgramParam.CONSTANT.mID;
tmp[idx++] = (int)mConstants[i].getID(mRS);
}
for (int i=0; i < mTextureCount; i++) {
tmp[idx++] = ProgramParam.TEXTURE_TYPE.mID;
tmp[idx++] = (int)mTextureTypes[i].mID;
texNames[i] = mTextureNames[i];
}
long id = mRS.nProgramFragmentCreate(mShader, texNames, tmp);
ProgramFragmentFixedFunction pf = new ProgramFragmentFixedFunction(id, mRS);
initProgram(pf);
return pf;
}
}
/**
* @deprecated in API 16
*/
public static class Builder {
/**
* @deprecated in API 16
*/
public static final int MAX_TEXTURE = 2;
int mNumTextures;
boolean mPointSpriteEnable;
boolean mVaryingColorEnable;
String mShader;
RenderScript mRS;
/**
* @deprecated in API 16
* EnvMode describes how textures are combined with the existing
* color in the fixed function fragment shader
*
**/
public enum EnvMode {
/**
* @deprecated in API 16
**/
REPLACE (1),
/**
* @deprecated in API 16
**/
MODULATE (2),
/**
* @deprecated in API 16
**/
DECAL (3);
int mID;
EnvMode(int id) {
mID = id;
}
}
/**
* @deprecated in API 16
* Format describes the pixel format of textures in the fixed
* function fragment shader and how they are sampled
*
**/
public enum Format {
/**
* @deprecated in API 16
**/
ALPHA (1),
/**
* @deprecated in API 16
**/
LUMINANCE_ALPHA (2),
/**
* @deprecated in API 16
**/
RGB (3),
/**
* @deprecated in API 16
**/
RGBA (4);
int mID;
Format(int id) {
mID = id;
}
}
private class Slot {
EnvMode env;
Format format;
Slot(EnvMode _env, Format _fmt) {
env = _env;
format = _fmt;
}
}
Slot[] mSlots;
private void buildShaderString() {
mShader = "//rs_shader_internal\n";
mShader += "varying lowp vec4 varColor;\n";
mShader += "varying vec2 varTex0;\n";
mShader += "void main() {\n";
if (mVaryingColorEnable) {
mShader += " lowp vec4 col = varColor;\n";
} else {
mShader += " lowp vec4 col = UNI_Color;\n";
}
if (mNumTextures != 0) {
if (mPointSpriteEnable) {
mShader += " vec2 t0 = gl_PointCoord;\n";
} else {
mShader += " vec2 t0 = varTex0.xy;\n";
}
}
for(int i = 0; i < mNumTextures; i ++) {
switch(mSlots[i].env) {
case REPLACE:
switch (mSlots[i].format) {
case ALPHA:
mShader += " col.a = texture2D(UNI_Tex0, t0).a;\n";
break;
case LUMINANCE_ALPHA:
mShader += " col.rgba = texture2D(UNI_Tex0, t0).rgba;\n";
break;
case RGB:
mShader += " col.rgb = texture2D(UNI_Tex0, t0).rgb;\n";
break;
case RGBA:
mShader += " col.rgba = texture2D(UNI_Tex0, t0).rgba;\n";
break;
}
break;
case MODULATE:
switch (mSlots[i].format) {
case ALPHA:
mShader += " col.a *= texture2D(UNI_Tex0, t0).a;\n";
break;
case LUMINANCE_ALPHA:
mShader += " col.rgba *= texture2D(UNI_Tex0, t0).rgba;\n";
break;
case RGB:
mShader += " col.rgb *= texture2D(UNI_Tex0, t0).rgb;\n";
break;
case RGBA:
mShader += " col.rgba *= texture2D(UNI_Tex0, t0).rgba;\n";
break;
}
break;
case DECAL:
mShader += " col = texture2D(UNI_Tex0, t0);\n";
break;
}
}
mShader += " gl_FragColor = col;\n";
mShader += "}\n";
}
/**
* @deprecated
* Creates a builder for fixed function fragment program
*
* @param rs Context to which the program will belong.
*/
public Builder(RenderScript rs) {
mRS = rs;
mSlots = new Slot[MAX_TEXTURE];
mPointSpriteEnable = false;
}
/**
* @deprecated in API 16
* Adds a texture to be fetched as part of the fixed function
* fragment program
*
* @param env specifies how the texture is combined with the
* current color
* @param fmt specifies the format of the texture and how its
* components will be used to combine with the
* current color
* @param slot index of the texture to apply the operations on
*
* @return this
*/
public Builder setTexture(EnvMode env, Format fmt, int slot)
throws IllegalArgumentException {
if((slot < 0) || (slot >= MAX_TEXTURE)) {
throw new IllegalArgumentException("MAX_TEXTURE exceeded.");
}
mSlots[slot] = new Slot(env, fmt);
return this;
}
/**
* @deprecated in API 16
* Specifies whether the texture coordinate passed from the
* vertex program is replaced with an openGL internal point
* sprite texture coordinate
*
**/
public Builder setPointSpriteTexCoordinateReplacement(boolean enable) {
mPointSpriteEnable = enable;
return this;
}
/**
* @deprecated in API 16
* Specifies whether the varying color passed from the vertex
* program or the constant color set on the fragment program is
* used in the final color calculation in the fixed function
* fragment shader
*
**/
public Builder setVaryingColor(boolean enable) {
mVaryingColorEnable = enable;
return this;
}
/**
* @deprecated in API 16
* Creates the fixed function fragment program from the current
* state of the builder.
*
*/
public ProgramFragmentFixedFunction create() {
InternalBuilder sb = new InternalBuilder(mRS);
mNumTextures = 0;
for(int i = 0; i < MAX_TEXTURE; i ++) {
if(mSlots[i] != null) {
mNumTextures ++;
}
}
buildShaderString();
sb.setShader(mShader);
Type constType = null;
if (!mVaryingColorEnable) {
Element.Builder b = new Element.Builder(mRS);
b.add(Element.F32_4(mRS), "Color");
Type.Builder typeBuilder = new Type.Builder(mRS, b.create());
typeBuilder.setX(1);
constType = typeBuilder.create();
sb.addConstant(constType);
}
for (int i = 0; i < mNumTextures; i ++) {
sb.addTexture(TextureType.TEXTURE_2D);
}
ProgramFragmentFixedFunction pf = sb.create();
pf.mTextureCount = MAX_TEXTURE;
if (!mVaryingColorEnable) {
Allocation constantData = Allocation.createTyped(mRS,constType);
FieldPacker fp = new FieldPacker(16);
Float4 f4 = new Float4(1.f, 1.f, 1.f, 1.f);
fp.addF32(f4);
constantData.setFromFieldPacker(0, fp);
pf.bindConstants(constantData, 0);
}
return pf;
}
}
}

View File

@@ -0,0 +1,168 @@
/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.renderscript;
/**
* @hide
* @deprecated in API 16
* Program raster is primarily used to specify whether point sprites are enabled and to control
* the culling mode. By default, back faces are culled.
**/
public class ProgramRaster extends BaseObj {
/**
* @deprecated in API 16
**/
public enum CullMode {
/**
* @deprecated in API 16
**/
BACK (0),
/**
* @deprecated in API 16
**/
FRONT (1),
/**
* @deprecated in API 16
**/
NONE (2);
int mID;
CullMode(int id) {
mID = id;
}
}
boolean mPointSprite;
CullMode mCullMode;
ProgramRaster(long id, RenderScript rs) {
super(id, rs);
mPointSprite = false;
mCullMode = CullMode.BACK;
}
/**
* @deprecated in API 16
* Specifies whether vertices are rendered as screen aligned
* elements of a specified size
* @return whether point sprites are enabled
*/
public boolean isPointSpriteEnabled() {
return mPointSprite;
}
/**
* @deprecated in API 16
* Specifies how triangles are culled based on their orientation
* @return cull mode
*/
public CullMode getCullMode() {
return mCullMode;
}
/**
* @deprecated in API 16
*/
public static ProgramRaster CULL_BACK(RenderScript rs) {
if(rs.mProgramRaster_CULL_BACK == null) {
ProgramRaster.Builder builder = new ProgramRaster.Builder(rs);
builder.setCullMode(CullMode.BACK);
rs.mProgramRaster_CULL_BACK = builder.create();
}
return rs.mProgramRaster_CULL_BACK;
}
/**
* @deprecated in API 16
*/
public static ProgramRaster CULL_FRONT(RenderScript rs) {
if(rs.mProgramRaster_CULL_FRONT == null) {
ProgramRaster.Builder builder = new ProgramRaster.Builder(rs);
builder.setCullMode(CullMode.FRONT);
rs.mProgramRaster_CULL_FRONT = builder.create();
}
return rs.mProgramRaster_CULL_FRONT;
}
/**
* @deprecated in API 16
*/
public static ProgramRaster CULL_NONE(RenderScript rs) {
if(rs.mProgramRaster_CULL_NONE == null) {
ProgramRaster.Builder builder = new ProgramRaster.Builder(rs);
builder.setCullMode(CullMode.NONE);
rs.mProgramRaster_CULL_NONE = builder.create();
}
return rs.mProgramRaster_CULL_NONE;
}
/**
* @deprecated in API 16
*/
public static class Builder {
RenderScript mRS;
boolean mPointSprite;
CullMode mCullMode;
/**
* @deprecated in API 16
*/
public Builder(RenderScript rs) {
mRS = rs;
mPointSprite = false;
mCullMode = CullMode.BACK;
}
/**
* @deprecated in API 16
*/
public Builder setPointSpriteEnabled(boolean enable) {
mPointSprite = enable;
return this;
}
/**
* @deprecated in API 16
*/
public Builder setCullMode(CullMode m) {
mCullMode = m;
return this;
}
/**
* @deprecated in API 16
*/
public ProgramRaster create() {
mRS.validate();
long id = mRS.nProgramRasterCreate(mPointSprite, mCullMode.mID);
ProgramRaster programRaster = new ProgramRaster(id, mRS);
programRaster.mPointSprite = mPointSprite;
programRaster.mCullMode = mCullMode;
return programRaster;
}
}
}

View File

@@ -0,0 +1,442 @@
/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.renderscript;
/**
* @hide
* <p>ProgramStore contains a set of parameters that control how
* the graphics hardware handles writes to the framebuffer.
* It could be used to:</p>
* <ul>
* <li>enable/disable depth testing</li>
* <li>specify wheather depth writes are performed</li>
* <li>setup various blending modes for use in effects like
* transparency</li>
* <li>define write masks for color components written into the
* framebuffer</li>
* </ul>
*
**/
public class ProgramStore extends BaseObj {
/**
* Specifies the function used to determine whether a fragment
* will be drawn during the depth testing stage in the rendering
* pipeline by comparing its value with that already in the depth
* buffer. DepthFunc is only valid when depth buffer is present
* and depth testing is enabled
*/
public enum DepthFunc {
/**
* Always drawn
*/
ALWAYS (0),
/**
* Drawn if the incoming depth value is less than that in the
* depth buffer
*/
LESS (1),
/**
* Drawn if the incoming depth value is less or equal to that in
* the depth buffer
*/
LESS_OR_EQUAL (2),
/**
* Drawn if the incoming depth value is greater than that in the
* depth buffer
*/
GREATER (3),
/**
* Drawn if the incoming depth value is greater or equal to that
* in the depth buffer
*/
GREATER_OR_EQUAL (4),
/**
* Drawn if the incoming depth value is equal to that in the
* depth buffer
*/
EQUAL (5),
/**
* Drawn if the incoming depth value is not equal to that in the
* depth buffer
*/
NOT_EQUAL (6);
int mID;
DepthFunc(int id) {
mID = id;
}
}
/**
* Specifies the functions used to combine incoming pixels with
* those already in the frame buffer.
*
* BlendSrcFunc describes how the coefficient used to scale the
* source pixels during the blending operation is computed
*
*/
public enum BlendSrcFunc {
ZERO (0),
ONE (1),
DST_COLOR (2),
ONE_MINUS_DST_COLOR (3),
SRC_ALPHA (4),
ONE_MINUS_SRC_ALPHA (5),
DST_ALPHA (6),
ONE_MINUS_DST_ALPHA (7),
SRC_ALPHA_SATURATE (8);
int mID;
BlendSrcFunc(int id) {
mID = id;
}
}
/**
* Specifies the functions used to combine incoming pixels with
* those already in the frame buffer.
*
* BlendDstFunc describes how the coefficient used to scale the
* pixels already in the framebuffer is computed during the
* blending operation
*
*/
public enum BlendDstFunc {
ZERO (0),
ONE (1),
SRC_COLOR (2),
ONE_MINUS_SRC_COLOR (3),
SRC_ALPHA (4),
ONE_MINUS_SRC_ALPHA (5),
DST_ALPHA (6),
ONE_MINUS_DST_ALPHA (7);
int mID;
BlendDstFunc(int id) {
mID = id;
}
}
DepthFunc mDepthFunc;
boolean mDepthMask;
boolean mColorMaskR;
boolean mColorMaskG;
boolean mColorMaskB;
boolean mColorMaskA;
BlendSrcFunc mBlendSrc;
BlendDstFunc mBlendDst;
boolean mDither;
ProgramStore(int id, RenderScript rs) {
super(id, rs);
}
/**
* Returns the function used to test writing into the depth
* buffer
* @return depth function
*/
public DepthFunc getDepthFunc() {
return mDepthFunc;
}
/**
* Queries whether writes are enabled into the depth buffer
* @return depth mask
*/
public boolean isDepthMaskEnabled() {
return mDepthMask;
}
/**
* Queries whether red channel is written
* @return red color channel mask
*/
public boolean isColorMaskRedEnabled() {
return mColorMaskR;
}
/**
* Queries whether green channel is written
* @return green color channel mask
*/
public boolean isColorMaskGreenEnabled() {
return mColorMaskG;
}
/**
* Queries whether blue channel is written
* @return blue color channel mask
*/
public boolean isColorMaskBlueEnabled() {
return mColorMaskB;
}
/**
* Queries whether alpha channel is written
* @return alpha channel mask
*/
public boolean isColorMaskAlphaEnabled() {
return mColorMaskA;
}
/**
* Specifies how the source blending factor is computed
* @return source blend function
*/
public BlendSrcFunc getBlendSrcFunc() {
return mBlendSrc;
}
/**
* Specifies how the destination blending factor is computed
* @return destination blend function
*/
public BlendDstFunc getBlendDstFunc() {
return mBlendDst;
}
/**
* Specifies whether colors are dithered before writing into the
* framebuffer
* @return whether dither is enabled
*/
public boolean isDitherEnabled() {
return mDither;
}
/**
* Returns a pre-defined program store object with the following
* characteristics:
* - incoming pixels are drawn if their depth value is less than
* the stored value in the depth buffer. If the pixel is
* drawn, its value is also stored in the depth buffer
* - incoming pixels override the value stored in the color
* buffer if it passes the depth test
*
* @param rs Context to which the program will belong.
**/
public static ProgramStore BLEND_NONE_DEPTH_TEST(RenderScript rs) {
if(rs.mProgramStore_BLEND_NONE_DEPTH_TEST == null) {
ProgramStore.Builder builder = new ProgramStore.Builder(rs);
builder.setDepthFunc(ProgramStore.DepthFunc.LESS);
builder.setBlendFunc(BlendSrcFunc.ONE, BlendDstFunc.ZERO);
builder.setDitherEnabled(false);
builder.setDepthMaskEnabled(true);
rs.mProgramStore_BLEND_NONE_DEPTH_TEST = builder.create();
}
return rs.mProgramStore_BLEND_NONE_DEPTH_TEST;
}
/**
* Returns a pre-defined program store object with the following
* characteristics:
* - incoming pixels always pass the depth test and their value
* is not stored in the depth buffer
* - incoming pixels override the value stored in the color
* buffer
*
* @param rs Context to which the program will belong.
**/
public static ProgramStore BLEND_NONE_DEPTH_NONE(RenderScript rs) {
if(rs.mProgramStore_BLEND_NONE_DEPTH_NO_DEPTH == null) {
ProgramStore.Builder builder = new ProgramStore.Builder(rs);
builder.setDepthFunc(ProgramStore.DepthFunc.ALWAYS);
builder.setBlendFunc(BlendSrcFunc.ONE, BlendDstFunc.ZERO);
builder.setDitherEnabled(false);
builder.setDepthMaskEnabled(false);
rs.mProgramStore_BLEND_NONE_DEPTH_NO_DEPTH = builder.create();
}
return rs.mProgramStore_BLEND_NONE_DEPTH_NO_DEPTH;
}
/**
* Returns a pre-defined program store object with the following
* characteristics:
* - incoming pixels are drawn if their depth value is less than
* the stored value in the depth buffer. If the pixel is
* drawn, its value is also stored in the depth buffer
* - if the incoming (Source) pixel passes depth test, its value
* is combined with the stored color (Dest) using the
* following formula
* Final.RGB = Source.RGB * Source.A + Dest.RGB * (1 - Source.A)
*
* @param rs Context to which the program will belong.
**/
public static ProgramStore BLEND_ALPHA_DEPTH_TEST(RenderScript rs) {
if(rs.mProgramStore_BLEND_ALPHA_DEPTH_TEST == null) {
ProgramStore.Builder builder = new ProgramStore.Builder(rs);
builder.setDepthFunc(ProgramStore.DepthFunc.LESS);
builder.setBlendFunc(BlendSrcFunc.SRC_ALPHA, BlendDstFunc.ONE_MINUS_SRC_ALPHA);
builder.setDitherEnabled(false);
builder.setDepthMaskEnabled(true);
rs.mProgramStore_BLEND_ALPHA_DEPTH_TEST = builder.create();
}
return rs.mProgramStore_BLEND_ALPHA_DEPTH_TEST;
}
/**
* Returns a pre-defined program store object with the following
* characteristics:
* - incoming pixels always pass the depth test and their value
* is not stored in the depth buffer
* - incoming pixel's value is combined with the stored color
* (Dest) using the following formula
* Final.RGB = Source.RGB * Source.A + Dest.RGB * (1 - Source.A)
*
* @param rs Context to which the program will belong.
**/
public static ProgramStore BLEND_ALPHA_DEPTH_NONE(RenderScript rs) {
if(rs.mProgramStore_BLEND_ALPHA_DEPTH_NO_DEPTH == null) {
ProgramStore.Builder builder = new ProgramStore.Builder(rs);
builder.setDepthFunc(ProgramStore.DepthFunc.ALWAYS);
builder.setBlendFunc(BlendSrcFunc.SRC_ALPHA, BlendDstFunc.ONE_MINUS_SRC_ALPHA);
builder.setDitherEnabled(false);
builder.setDepthMaskEnabled(false);
rs.mProgramStore_BLEND_ALPHA_DEPTH_NO_DEPTH = builder.create();
}
return rs.mProgramStore_BLEND_ALPHA_DEPTH_NO_DEPTH;
}
/**
* Builder class for ProgramStore object. If the builder is left
* empty, the equivalent of BLEND_NONE_DEPTH_NONE would be
* returned
*/
public static class Builder {
RenderScript mRS;
DepthFunc mDepthFunc;
boolean mDepthMask;
boolean mColorMaskR;
boolean mColorMaskG;
boolean mColorMaskB;
boolean mColorMaskA;
BlendSrcFunc mBlendSrc;
BlendDstFunc mBlendDst;
boolean mDither;
public Builder(RenderScript rs) {
mRS = rs;
mDepthFunc = DepthFunc.ALWAYS;
mDepthMask = false;
mColorMaskR = true;
mColorMaskG = true;
mColorMaskB = true;
mColorMaskA = true;
mBlendSrc = BlendSrcFunc.ONE;
mBlendDst = BlendDstFunc.ZERO;
}
/**
* Specifies the depth testing behavior
*
* @param func function used for depth testing
*
* @return this
*/
public Builder setDepthFunc(DepthFunc func) {
mDepthFunc = func;
return this;
}
/**
* Enables writes into the depth buffer
*
* @param enable specifies whether depth writes are
* enabled or disabled
*
* @return this
*/
public Builder setDepthMaskEnabled(boolean enable) {
mDepthMask = enable;
return this;
}
/**
* Enables writes into the color buffer
*
* @param r specifies whether red channel is written
* @param g specifies whether green channel is written
* @param b specifies whether blue channel is written
* @param a specifies whether alpha channel is written
*
* @return this
*/
public Builder setColorMaskEnabled(boolean r, boolean g, boolean b, boolean a) {
mColorMaskR = r;
mColorMaskG = g;
mColorMaskB = b;
mColorMaskA = a;
return this;
}
/**
* Specifies how incoming pixels are combined with the pixels
* stored in the framebuffer
*
* @param src specifies how the source blending factor is
* computed
* @param dst specifies how the destination blending factor is
* computed
*
* @return this
*/
public Builder setBlendFunc(BlendSrcFunc src, BlendDstFunc dst) {
mBlendSrc = src;
mBlendDst = dst;
return this;
}
/**
* Enables dithering
*
* @param enable specifies whether dithering is enabled or
* disabled
*
* @return this
*/
public Builder setDitherEnabled(boolean enable) {
mDither = enable;
return this;
}
/**
* Creates a program store from the current state of the builder
*/
public ProgramStore create() {
mRS.validate();
int id = mRS.nProgramStoreCreate(mColorMaskR, mColorMaskG, mColorMaskB, mColorMaskA,
mDepthMask, mDither,
mBlendSrc.mID, mBlendDst.mID, mDepthFunc.mID);
ProgramStore programStore = new ProgramStore(id, mRS);
programStore.mDepthFunc = mDepthFunc;
programStore.mDepthMask = mDepthMask;
programStore.mColorMaskR = mColorMaskR;
programStore.mColorMaskG = mColorMaskG;
programStore.mColorMaskB = mColorMaskB;
programStore.mColorMaskA = mColorMaskA;
programStore.mBlendSrc = mBlendSrc;
programStore.mBlendDst = mBlendDst;
programStore.mDither = mDither;
return programStore;
}
}
}

View File

@@ -0,0 +1,154 @@
/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @hide
* <p>The RenderScript vertex program, also known as a vertex shader, describes a stage in
* the graphics pipeline responsible for manipulating geometric data in a user-defined way.
* The object is constructed by providing the RenderScript system with the following data:</p>
* <ul>
* <li>Element describing its varying inputs or attributes</li>
* <li>GLSL shader string that defines the body of the program</li>
* <li>a Type that describes the layout of an Allocation containing constant or uniform inputs</li>
* </ul>
*
* <p>Once the program is created, you bind it to the graphics context, RenderScriptGL, and it will be used for
* all subsequent draw calls until you bind a new program. If the program has constant inputs,
* the user needs to bind an allocation containing those inputs. The allocation's type must match
* the one provided during creation. The RenderScript library then does all the necessary plumbing
* to send those constants to the graphics hardware. Varying inputs to the shader, such as position, normal,
* and texture coordinates are matched by name between the input Element and the Mesh object being drawn.
* The signatures don't have to be exact or in any strict order. As long as the input name in the shader
* matches a channel name and size available on the mesh, the runtime takes care of connecting the
* two. Unlike OpenGL, there is no need to link the vertex and fragment programs.</p>
*
**/
package android.renderscript;
/**
* @hide
* @deprecated in API 16
* ProgramVertex, also know as a vertex shader, describes a
* stage in the graphics pipeline responsible for manipulating
* geometric data in a user-defined way.
*
**/
public class ProgramVertex extends Program {
ProgramVertex(long id, RenderScript rs) {
super(id, rs);
}
/**
* @deprecated in API 16
* @return number of input attribute elements
*/
public int getInputCount() {
return mInputs != null ? mInputs.length : 0;
}
/**
* @deprecated in API 16
* @param slot location of the input to return
* @return input attribute element
*/
public Element getInput(int slot) {
if (slot < 0 || slot >= mInputs.length) {
throw new IllegalArgumentException("Slot ID out of range.");
}
return mInputs[slot];
}
/**
* @hide
* @deprecated in API 16
* Builder class for creating ProgramVertex objects.
* The builder starts empty and the user must minimally provide
* the GLSL shader code, and the varying inputs. Constant, or
* uniform parameters to the shader may optionally be provided as
* well.
*
**/
public static class Builder extends BaseProgramBuilder {
/**
* @deprecated in API 16
* Create a builder object.
*
* @param rs Context to which the program will belong.
*/
public Builder(RenderScript rs) {
super(rs);
}
/**
* @deprecated in API 16
* Add varying inputs to the program
*
* @param e element describing the layout of the varying input
* structure
* @return self
*/
public Builder addInput(Element e) throws IllegalStateException {
// Should check for consistant and non-conflicting names...
if(mInputCount >= MAX_INPUT) {
throw new RSIllegalArgumentException("Max input count exceeded.");
}
if (e.isComplex()) {
throw new RSIllegalArgumentException("Complex elements not allowed.");
}
mInputs[mInputCount++] = e;
return this;
}
/**
* @deprecated in API 16
* Creates ProgramVertex from the current state of the builder
*
* @return ProgramVertex
*/
public ProgramVertex create() {
mRS.validate();
int[] tmp = new int[(mInputCount + mOutputCount + mConstantCount + mTextureCount) * 2];
String[] texNames = new String[mTextureCount];
int idx = 0;
for (int i=0; i < mInputCount; i++) {
tmp[idx++] = ProgramParam.INPUT.mID;
tmp[idx++] = (int)mInputs[i].getID(mRS);
}
for (int i=0; i < mOutputCount; i++) {
tmp[idx++] = ProgramParam.OUTPUT.mID;
tmp[idx++] = (int)mOutputs[i].getID(mRS);
}
for (int i=0; i < mConstantCount; i++) {
tmp[idx++] = ProgramParam.CONSTANT.mID;
tmp[idx++] = (int)mConstants[i].getID(mRS);
}
for (int i=0; i < mTextureCount; i++) {
tmp[idx++] = ProgramParam.TEXTURE_TYPE.mID;
tmp[idx++] = (int)mTextureTypes[i].mID;
texNames[i] = mTextureNames[i];
}
long id = mRS.nProgramVertexCreate(mShader, texNames, tmp);
ProgramVertex pv = new ProgramVertex(id, mRS);
initProgram(pv);
return pv;
}
}
}

View File

@@ -0,0 +1,287 @@
/*
* Copyright (C) 2008-2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.renderscript;
/**
* @hide
* @deprecated in API 16
* ProgramVertexFixedFunction is a helper class that provides a
* simple way to create a fixed function emulation vertex shader
* without writing any GLSL code.
*
**/
public class ProgramVertexFixedFunction extends ProgramVertex {
ProgramVertexFixedFunction(long id, RenderScript rs) {
super(id, rs);
}
/**
* @deprecated in API 16
* Binds the constant buffer containing fixed function emulation
* matrices
*
* @param va allocation containing fixed function matrices
*/
public void bindConstants(Constants va) {
mRS.validate();
bindConstants(va.getAllocation(), 0);
}
static class InternalBuilder extends BaseProgramBuilder {
/**
* @deprecated in API 16
*/
public InternalBuilder(RenderScript rs) {
super(rs);
}
/**
* @deprecated in API 16
*/
public InternalBuilder addInput(Element e) throws IllegalStateException {
// Should check for consistant and non-conflicting names...
if(mInputCount >= MAX_INPUT) {
throw new RSIllegalArgumentException("Max input count exceeded.");
}
if (e.isComplex()) {
throw new RSIllegalArgumentException("Complex elements not allowed.");
}
mInputs[mInputCount++] = e;
return this;
}
/**
* @deprecated in API 16
* Creates ProgramVertexFixedFunction from the current state of
* the builder
*
* @return ProgramVertexFixedFunction
*/
public ProgramVertexFixedFunction create() {
mRS.validate();
int[] tmp = new int[(mInputCount + mOutputCount + mConstantCount + mTextureCount) * 2];
String[] texNames = new String[mTextureCount];
int idx = 0;
for (int i=0; i < mInputCount; i++) {
tmp[idx++] = ProgramParam.INPUT.mID;
tmp[idx++] = (int)mInputs[i].getID(mRS);
}
for (int i=0; i < mOutputCount; i++) {
tmp[idx++] = ProgramParam.OUTPUT.mID;
tmp[idx++] = (int)mOutputs[i].getID(mRS);
}
for (int i=0; i < mConstantCount; i++) {
tmp[idx++] = ProgramParam.CONSTANT.mID;
tmp[idx++] = (int)mConstants[i].getID(mRS);
}
for (int i=0; i < mTextureCount; i++) {
tmp[idx++] = ProgramParam.TEXTURE_TYPE.mID;
tmp[idx++] = (int)mTextureTypes[i].mID;
texNames[i] = mTextureNames[i];
}
long id = mRS.nProgramVertexCreate(mShader, texNames, tmp);
ProgramVertexFixedFunction pv = new ProgramVertexFixedFunction(id, mRS);
initProgram(pv);
return pv;
}
}
/**
* @deprecated in API 16
*/
public static class Builder {
boolean mTextureMatrixEnable;
String mShader;
RenderScript mRS;
/**
* @deprecated in API 16
* Creates a builder for fixed function vertex program
*
* @param rs Context to which the program will belong.
*/
public Builder(RenderScript rs) {
mRS = rs;
}
/**
* @deprecated in API 16
* Specifies whether texture matrix calculations are to be added
* to the shader
*
*/
public Builder setTextureMatrixEnable(boolean enable) {
mTextureMatrixEnable = enable;
return this;
}
static Type getConstantInputType(RenderScript rs) {
Element.Builder b = new Element.Builder(rs);
b.add(Element.MATRIX4X4(rs), "MV");
b.add(Element.MATRIX4X4(rs), "P");
b.add(Element.MATRIX4X4(rs), "TexMatrix");
b.add(Element.MATRIX4X4(rs), "MVP");
Type.Builder typeBuilder = new Type.Builder(rs, b.create());
typeBuilder.setX(1);
return typeBuilder.create();
}
private void buildShaderString() {
mShader = "//rs_shader_internal\n";
mShader += "varying vec4 varColor;\n";
mShader += "varying vec2 varTex0;\n";
mShader += "void main() {\n";
mShader += " gl_Position = UNI_MVP * ATTRIB_position;\n";
mShader += " gl_PointSize = 1.0;\n";
mShader += " varColor = ATTRIB_color;\n";
if (mTextureMatrixEnable) {
mShader += " varTex0 = (UNI_TexMatrix * vec4(ATTRIB_texture0, 0.0, 1.0)).xy;\n";
} else {
mShader += " varTex0 = ATTRIB_texture0;\n";
}
mShader += "}\n";
}
/**
* @deprecated in API 16
* Creates ProgramVertexFixedFunction from the current state of
* the builder
*
* @return Fixed function emulation ProgramVertex
*/
public ProgramVertexFixedFunction create() {
buildShaderString();
InternalBuilder sb = new InternalBuilder(mRS);
sb.setShader(mShader);
sb.addConstant(getConstantInputType(mRS));
Element.Builder b = new Element.Builder(mRS);
b.add(Element.F32_4(mRS), "position");
b.add(Element.F32_4(mRS), "color");
b.add(Element.F32_3(mRS), "normal");
b.add(Element.F32_2(mRS), "texture0");
sb.addInput(b.create());
return sb.create();
}
}
/**
* @deprecated in API 16
* Helper class to store modelview, projection and texture
* matrices for ProgramVertexFixedFunction
*
*/
public static class Constants {
static final int MODELVIEW_OFFSET = 0;
static final int PROJECTION_OFFSET = 16;
static final int TEXTURE_OFFSET = 32;
Matrix4f mModel;
Matrix4f mProjection;
Matrix4f mTexture;
Allocation mAlloc;
Allocation getAllocation() {
return mAlloc;
}
private FieldPacker mIOBuffer;
/**
* @deprecated in API 16
* Creates a buffer to store fixed function emulation matrices
*
* @param rs Context to which the allocation will belong.
**/
public Constants(RenderScript rs) {
Type constInputType = ProgramVertexFixedFunction.Builder.getConstantInputType(rs);
mAlloc = Allocation.createTyped(rs, constInputType);
int bufferSize = constInputType.getElement().getBytesSize()*
constInputType.getCount();
mIOBuffer = new FieldPacker(bufferSize);
mModel = new Matrix4f();
mProjection = new Matrix4f();
mTexture = new Matrix4f();
setModelview(new Matrix4f());
setProjection(new Matrix4f());
setTexture(new Matrix4f());
}
/**
* @deprecated in API 16
* Forces deallocation of memory backing the contant matrices.
* Normally, this is unnecessary and will be garbage collected
*
*/
public void destroy() {
mAlloc.destroy();
mAlloc = null;
}
private void addToBuffer(int offset, Matrix4f m) {
mIOBuffer.reset(offset);
for(int i = 0; i < 16; i ++) {
mIOBuffer.addF32(m.mMat[i]);
}
mAlloc.setFromFieldPacker(0, mIOBuffer);
}
/**
* @deprecated in API 16
* Sets the modelview matrix in the fixed function matrix buffer
*
* @param m modelview matrix
*/
public void setModelview(Matrix4f m) {
mModel.load(m);
addToBuffer(MODELVIEW_OFFSET*4, m);
}
/**
* @deprecated in API 16
* Sets the projection matrix in the fixed function matrix buffer
*
* @param m projection matrix
*/
public void setProjection(Matrix4f m) {
mProjection.load(m);
addToBuffer(PROJECTION_OFFSET*4, m);
}
/**
* @deprecated in API 16
* Sets the texture matrix in the fixed function matrix buffer.
* Texture matrix must be enabled in the
* ProgramVertexFixedFunction builder for the shader to utilize
* it.
*
* @param m modelview matrix
*/
public void setTexture(Matrix4f m) {
mTexture.load(m);
addToBuffer(TEXTURE_OFFSET*4, m);
}
}
}

View File

@@ -0,0 +1,31 @@
/*
* Copyright (C) 2010 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.renderscript;
/**
* Base class for all exceptions thrown by the Android
* RenderScript
*/
public class RSDriverException extends RSRuntimeException {
public RSDriverException(String string) {
super(string);
}
}

View File

@@ -0,0 +1,30 @@
/*
* Copyright (C) 2010 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.renderscript;
/**
* Base class for all exceptions thrown by the Android
* RenderScript
*/
public class RSIllegalArgumentException extends RSRuntimeException {
public RSIllegalArgumentException(String string) {
super(string);
}
}

View File

@@ -0,0 +1,31 @@
/*
* Copyright (C) 2010 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.renderscript;
/**
* Base class for all exceptions thrown by the Android
* RenderScript
*/
public class RSInvalidStateException extends RSRuntimeException {
public RSInvalidStateException(String string) {
super(string);
}
}

View File

@@ -0,0 +1,30 @@
/*
* Copyright (C) 2010 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.renderscript;
/**
* Base class for all exceptions thrown by the Android
* RenderScript
*/
public class RSRuntimeException
extends java.lang.RuntimeException {
public RSRuntimeException(String string) {
super(string);
}
}

View File

@@ -0,0 +1,165 @@
/*
* Copyright (C) 2008-2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.renderscript;
import android.content.Context;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
/**
* @hide
* @deprecated in API 16
* The Surface View for a graphics renderscript (RenderScriptGL) to draw on.
*
* <div class="special reference">
* <h3>Developer Guides</h3>
* <p>For more information about creating an application that uses RenderScript, read the
* <a href="{@docRoot}guide/topics/renderscript/index.html">RenderScript</a> developer guide.</p>
* </div>
*/
public class RSSurfaceView extends SurfaceView implements SurfaceHolder.Callback {
private SurfaceHolder mSurfaceHolder;
private RenderScriptGL mRS;
/**
* @deprecated in API 16
* Standard View constructor. In order to render something, you
* must call {@link android.opengl.GLSurfaceView#setRenderer} to
* register a renderer.
*/
public RSSurfaceView(Context context) {
super(context);
init();
//Log.v(RenderScript.LOG_TAG, "RSSurfaceView");
}
/**
* @deprecated in API 16
* Standard View constructor. In order to render something, you
* must call {@link android.opengl.GLSurfaceView#setRenderer} to
* register a renderer.
*/
public RSSurfaceView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
//Log.v(RenderScript.LOG_TAG, "RSSurfaceView");
}
private void init() {
// Install a SurfaceHolder.Callback so we get notified when the
// underlying surface is created and destroyed
SurfaceHolder holder = getHolder();
holder.addCallback(this);
}
/**
* @deprecated in API 16
* This method is part of the SurfaceHolder.Callback interface, and is
* not normally called or subclassed by clients of RSSurfaceView.
*/
public void surfaceCreated(SurfaceHolder holder) {
mSurfaceHolder = holder;
}
/**
* @deprecated in API 16
* This method is part of the SurfaceHolder.Callback interface, and is
* not normally called or subclassed by clients of RSSurfaceView.
*/
public void surfaceDestroyed(SurfaceHolder holder) {
synchronized (this) {
// Surface will be destroyed when we return
if (mRS != null) {
mRS.setSurface(null, 0, 0);
}
}
}
/**
* @deprecated in API 16
* This method is part of the SurfaceHolder.Callback interface, and is
* not normally called or subclassed by clients of RSSurfaceView.
*/
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
synchronized (this) {
if (mRS != null) {
mRS.setSurface(holder, w, h);
}
}
}
/**
* @deprecated in API 16
* Inform the view that the activity is paused. The owner of this view must
* call this method when the activity is paused. Calling this method will
* pause the rendering thread.
* Must not be called before a renderer has been set.
*/
public void pause() {
if(mRS != null) {
mRS.pause();
}
}
/**
* @deprecated in API 16
* Inform the view that the activity is resumed. The owner of this view must
* call this method when the activity is resumed. Calling this method will
* recreate the OpenGL display and resume the rendering
* thread.
* Must not be called before a renderer has been set.
*/
public void resume() {
if(mRS != null) {
mRS.resume();
}
}
/**
* @deprecated in API 16
**/
public RenderScriptGL createRenderScriptGL(RenderScriptGL.SurfaceConfig sc) {
RenderScriptGL rs = new RenderScriptGL(this.getContext(), sc);
setRenderScriptGL(rs);
return rs;
}
/**
* @deprecated in API 16
**/
public void destroyRenderScriptGL() {
synchronized (this) {
mRS.destroy();
mRS = null;
}
}
/**
* @deprecated in API 16
**/
public void setRenderScriptGL(RenderScriptGL rs) {
mRS = rs;
}
/**
* @deprecated in API 16
**/
public RenderScriptGL getRenderScriptGL() {
return mRS;
}
}

View File

@@ -0,0 +1,194 @@
/*
* Copyright (C) 2011 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.renderscript;
import android.content.Context;
import android.graphics.SurfaceTexture;
import android.util.AttributeSet;
import android.view.TextureView;
/**
* @hide
* @deprecated in API 16
* The Texture View for a graphics renderscript (RenderScriptGL)
* to draw on.
*
*/
public class RSTextureView extends TextureView implements TextureView.SurfaceTextureListener {
private RenderScriptGL mRS;
private SurfaceTexture mSurfaceTexture;
/**
* @deprecated in API 16
* Standard View constructor. In order to render something, you
* must call {@link android.opengl.GLSurfaceView#setRenderer} to
* register a renderer.
*/
public RSTextureView(Context context) {
super(context);
init();
//Log.v(RenderScript.LOG_TAG, "RSSurfaceView");
}
/**
* @deprecated in API 16
* Standard View constructor. In order to render something, you
* must call {@link android.opengl.GLSurfaceView#setRenderer} to
* register a renderer.
*/
public RSTextureView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
//Log.v(RenderScript.LOG_TAG, "RSSurfaceView");
}
private void init() {
setSurfaceTextureListener(this);
//android.util.Log.e("rs", "getSurfaceTextureListerner " + getSurfaceTextureListener());
}
/**
* @deprecated in API 16
*/
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
//Log.e(RenderScript.LOG_TAG, "onSurfaceTextureAvailable");
mSurfaceTexture = surface;
if (mRS != null) {
mRS.setSurfaceTexture(mSurfaceTexture, width, height);
}
}
/**
* @deprecated in API 16
*/
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
//Log.e(RenderScript.LOG_TAG, "onSurfaceTextureSizeChanged");
mSurfaceTexture = surface;
if (mRS != null) {
mRS.setSurfaceTexture(mSurfaceTexture, width, height);
}
}
/**
* @deprecated in API 16
*/
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
//Log.e(RenderScript.LOG_TAG, "onSurfaceTextureDestroyed");
mSurfaceTexture = surface;
if (mRS != null) {
mRS.setSurfaceTexture(null, 0, 0);
}
return true;
}
/**
* @deprecated in API 16
*/
@Override
public void onSurfaceTextureUpdated(SurfaceTexture surface) {
//Log.e(RenderScript.LOG_TAG, "onSurfaceTextureUpdated");
mSurfaceTexture = surface;
}
/**
* @deprecated in API 16
* Inform the view that the activity is paused. The owner of this view must
* call this method when the activity is paused. Calling this method will
* pause the rendering thread.
* Must not be called before a renderer has been set.
*/
public void pause() {
if(mRS != null) {
mRS.pause();
}
}
/**
* @deprecated in API 16
* Inform the view that the activity is resumed. The owner of this view must
* call this method when the activity is resumed. Calling this method will
* recreate the OpenGL display and resume the rendering
* thread.
* Must not be called before a renderer has been set.
*/
public void resume() {
if(mRS != null) {
mRS.resume();
}
}
/**
* @deprecated in API 16
* Create a new RenderScriptGL object and attach it to the
* TextureView if present.
*
*
* @param sc The RS surface config to create.
*
* @return RenderScriptGL The new object created.
*/
public RenderScriptGL createRenderScriptGL(RenderScriptGL.SurfaceConfig sc) {
RenderScriptGL rs = new RenderScriptGL(this.getContext(), sc);
setRenderScriptGL(rs);
if (mSurfaceTexture != null) {
mRS.setSurfaceTexture(mSurfaceTexture, getWidth(), getHeight());
}
return rs;
}
/**
* @deprecated in API 16
* Destroy the RenderScriptGL object associated with this
* TextureView.
*/
public void destroyRenderScriptGL() {
mRS.destroy();
mRS = null;
}
/**
* @deprecated in API 16
* Set a new RenderScriptGL object. This also will attach the
* new object to the TextureView if present.
*
* @param rs The new RS object.
*/
public void setRenderScriptGL(RenderScriptGL rs) {
mRS = rs;
if (mSurfaceTexture != null) {
mRS.setSurfaceTexture(mSurfaceTexture, getWidth(), getHeight());
}
}
/**
* @deprecated in API 16
* Returns the previously set RenderScriptGL object.
*
* @return RenderScriptGL
*/
public RenderScriptGL getRenderScriptGL() {
return mRS;
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,333 @@
/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.renderscript;
import android.content.Context;
import android.graphics.SurfaceTexture;
import android.view.Surface;
import android.view.SurfaceHolder;
/**
* @hide
* @deprecated in API 16
* The Graphics derivitive of RenderScript. Extends the basic context to add a
* root script which is the display window for graphical output. When the
* system needs to update the display the currently bound root script will be
* called. This script is expected to issue the rendering commands to repaint
* the screen.
*
* <div class="special reference">
* <h3>Developer Guides</h3>
* <p>For more information about creating an application that uses RenderScript, read the
* <a href="{@docRoot}guide/topics/renderscript/index.html">RenderScript</a> developer guide.</p>
* </div>
**/
public class RenderScriptGL extends RenderScript {
int mWidth;
int mHeight;
/**
* @deprecated in API 16
* Class which is used to describe a pixel format for a graphical buffer.
* This is used to describe the intended format of the display surface.
*
* The configuration is described by pairs of minimum and preferred bit
* depths for each component within the config and additional structural
* information.
*/
public static class SurfaceConfig {
int mDepthMin = 0;
int mDepthPref = 0;
int mStencilMin = 0;
int mStencilPref = 0;
int mColorMin = 8;
int mColorPref = 8;
int mAlphaMin = 0;
int mAlphaPref = 0;
int mSamplesMin = 1;
int mSamplesPref = 1;
float mSamplesQ = 1.f;
/**
* @deprecated in API 16
*/
public SurfaceConfig() {
}
/**
* @deprecated in API 16
*/
public SurfaceConfig(SurfaceConfig sc) {
mDepthMin = sc.mDepthMin;
mDepthPref = sc.mDepthPref;
mStencilMin = sc.mStencilMin;
mStencilPref = sc.mStencilPref;
mColorMin = sc.mColorMin;
mColorPref = sc.mColorPref;
mAlphaMin = sc.mAlphaMin;
mAlphaPref = sc.mAlphaPref;
mSamplesMin = sc.mSamplesMin;
mSamplesPref = sc.mSamplesPref;
mSamplesQ = sc.mSamplesQ;
}
private void validateRange(int umin, int upref, int rmin, int rmax) {
if (umin < rmin || umin > rmax) {
throw new RSIllegalArgumentException("Minimum value provided out of range.");
}
if (upref < umin) {
throw new RSIllegalArgumentException("preferred must be >= Minimum.");
}
}
/**
* @deprecated in API 16
* Set the per-component bit depth for color (red, green, blue). This
* configures the surface for an unsigned integer buffer type.
*
* @param minimum
* @param preferred
*/
public void setColor(int minimum, int preferred) {
validateRange(minimum, preferred, 5, 8);
mColorMin = minimum;
mColorPref = preferred;
}
/**
* @deprecated in API 16
* Set the bit depth for alpha. This configures the surface for
* an unsigned integer buffer type.
*
* @param minimum
* @param preferred
*/
public void setAlpha(int minimum, int preferred) {
validateRange(minimum, preferred, 0, 8);
mAlphaMin = minimum;
mAlphaPref = preferred;
}
/**
* @deprecated in API 16
* Set the bit depth for the depth buffer. This configures the
* surface for an unsigned integer buffer type. If a minimum of 0
* is specified then its possible no depth buffer will be
* allocated.
*
* @param minimum
* @param preferred
*/
public void setDepth(int minimum, int preferred) {
validateRange(minimum, preferred, 0, 24);
mDepthMin = minimum;
mDepthPref = preferred;
}
/**
* @deprecated in API 16
* Configure the multisample rendering.
*
* @param minimum The required number of samples, must be at least 1.
* @param preferred The targe number of samples, must be at least
* minimum
* @param Q The quality of samples, range 0-1. Used to decide between
* different formats which have the same number of samples but
* different rendering quality.
*/
public void setSamples(int minimum, int preferred, float Q) {
validateRange(minimum, preferred, 1, 32);
if (Q < 0.0f || Q > 1.0f) {
throw new RSIllegalArgumentException("Quality out of 0-1 range.");
}
mSamplesMin = minimum;
mSamplesPref = preferred;
mSamplesQ = Q;
}
};
SurfaceConfig mSurfaceConfig;
/**
* @deprecated in API 16
* Construct a new RenderScriptGL context.
*
* @param ctx The context.
* @param sc The desired format of the primary rendering surface.
*/
public RenderScriptGL(Context ctx, SurfaceConfig sc) {
super(ctx);
mSurfaceConfig = new SurfaceConfig(sc);
int sdkVersion = ctx.getApplicationInfo().targetSdkVersion;
mWidth = 0;
mHeight = 0;
mDev = nDeviceCreate();
int dpi = ctx.getResources().getDisplayMetrics().densityDpi;
mContext = nContextCreateGL(mDev, 0, sdkVersion,
mSurfaceConfig.mColorMin, mSurfaceConfig.mColorPref,
mSurfaceConfig.mAlphaMin, mSurfaceConfig.mAlphaPref,
mSurfaceConfig.mDepthMin, mSurfaceConfig.mDepthPref,
mSurfaceConfig.mStencilMin, mSurfaceConfig.mStencilPref,
mSurfaceConfig.mSamplesMin, mSurfaceConfig.mSamplesPref,
mSurfaceConfig.mSamplesQ, dpi);
if (mContext == 0) {
throw new RSDriverException("Failed to create RS context.");
}
mMessageThread = new MessageThread(this);
mMessageThread.start();
}
/**
* @deprecated in API 16
* Bind an os surface
*
*
* @param w
* @param h
* @param sur
*/
public void setSurface(SurfaceHolder sur, int w, int h) {
validate();
Surface s = null;
if (sur != null) {
s = sur.getSurface();
}
mWidth = w;
mHeight = h;
nContextSetSurface(w, h, s);
}
/**
* @deprecated in API 16
* Bind an os surface
*
* @param w
* @param h
* @param sur
*/
public void setSurfaceTexture(SurfaceTexture sur, int w, int h) {
validate();
//android.util.Log.v("rs", "set surface " + sur + " w=" + w + ", h=" + h);
mWidth = w;
mHeight = h;
nContextSetSurfaceTexture(w, h, sur);
}
/**
* @deprecated in API 16
* return the height of the last set surface.
*
* @return int
*/
public int getHeight() {
return mHeight;
}
/**
* @deprecated in API 16
* return the width of the last set surface.
*
* @return int
*/
public int getWidth() {
return mWidth;
}
/**
* @deprecated in API 16
* Temporarly halt calls to the root rendering script.
*
*/
public void pause() {
validate();
nContextPause();
}
/**
* @deprecated in API 16
* Resume calls to the root rendering script.
*
*/
public void resume() {
validate();
nContextResume();
}
/**
* @deprecated in API 16
* Set the script to handle calls to render the primary surface.
*
* @param s Graphics script to process rendering requests.
*/
public void bindRootScript(Script s) {
validate();
nContextBindRootScript((int)safeID(s));
}
/**
* @deprecated in API 16
* Set the default ProgramStore object seen as the parent state by the root
* rendering script.
*
* @param p
*/
public void bindProgramStore(ProgramStore p) {
validate();
nContextBindProgramStore((int)safeID(p));
}
/**
* @deprecated in API 16
* Set the default ProgramFragment object seen as the parent state by the
* root rendering script.
*
* @param p
*/
public void bindProgramFragment(ProgramFragment p) {
validate();
nContextBindProgramFragment((int)safeID(p));
}
/**
* @deprecated in API 16
* Set the default ProgramRaster object seen as the parent state by the
* root rendering script.
*
* @param p
*/
public void bindProgramRaster(ProgramRaster p) {
validate();
nContextBindProgramRaster((int)safeID(p));
}
/**
* @deprecated in API 16
* Set the default ProgramVertex object seen as the parent state by the
* root rendering script.
*
* @param p
*/
public void bindProgramVertex(ProgramVertex p) {
validate();
nContextBindProgramVertex((int)safeID(p));
}
}

View File

@@ -0,0 +1,353 @@
/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.renderscript;
/**
* Sampler object that defines how Allocations can be read as textures within a
* kernel. Samplers are used in conjunction with the {@code rsSample} runtime
* function to return values from normalized coordinates.
*
* Any Allocation used with a Sampler must have been created with {@link
* android.renderscript.Allocation#USAGE_GRAPHICS_TEXTURE}; using a Sampler on
* an {@link android.renderscript.Allocation} that was not created with {@link
* android.renderscript.Allocation#USAGE_GRAPHICS_TEXTURE} is undefined.
**/
public class Sampler extends BaseObj {
public enum Value {
NEAREST (0),
LINEAR (1),
LINEAR_MIP_LINEAR (2),
LINEAR_MIP_NEAREST (5),
WRAP (3),
CLAMP (4),
MIRRORED_REPEAT (6);
int mID;
Value(int id) {
mID = id;
}
}
Value mMin;
Value mMag;
Value mWrapS;
Value mWrapT;
Value mWrapR;
float mAniso;
Sampler(int id, RenderScript rs) {
super(id, rs);
}
/**
* @return minification setting for the sampler
*/
public Value getMinification() {
return mMin;
}
/**
* @return magnification setting for the sampler
*/
public Value getMagnification() {
return mMag;
}
/**
* @return S wrapping mode for the sampler
*/
public Value getWrapS() {
return mWrapS;
}
/**
* @return T wrapping mode for the sampler
*/
public Value getWrapT() {
return mWrapT;
}
/**
* @return anisotropy setting for the sampler
*/
public float getAnisotropy() {
return mAniso;
}
/**
* Retrieve a sampler with min and mag set to nearest and wrap modes set to
* clamp.
*
* @param rs Context to which the sampler will belong.
*
* @return Sampler
*/
public static Sampler CLAMP_NEAREST(RenderScript rs) {
if(rs.mSampler_CLAMP_NEAREST == null) {
Builder b = new Builder(rs);
b.setMinification(Value.NEAREST);
b.setMagnification(Value.NEAREST);
b.setWrapS(Value.CLAMP);
b.setWrapT(Value.CLAMP);
rs.mSampler_CLAMP_NEAREST = b.create();
}
return rs.mSampler_CLAMP_NEAREST;
}
/**
* Retrieve a sampler with min and mag set to linear and wrap modes set to
* clamp.
*
* @param rs Context to which the sampler will belong.
*
* @return Sampler
*/
public static Sampler CLAMP_LINEAR(RenderScript rs) {
if(rs.mSampler_CLAMP_LINEAR == null) {
Builder b = new Builder(rs);
b.setMinification(Value.LINEAR);
b.setMagnification(Value.LINEAR);
b.setWrapS(Value.CLAMP);
b.setWrapT(Value.CLAMP);
rs.mSampler_CLAMP_LINEAR = b.create();
}
return rs.mSampler_CLAMP_LINEAR;
}
/**
* Retrieve a sampler with mag set to linear, min linear mipmap linear, and
* wrap modes set to clamp.
*
* @param rs Context to which the sampler will belong.
*
* @return Sampler
*/
public static Sampler CLAMP_LINEAR_MIP_LINEAR(RenderScript rs) {
if(rs.mSampler_CLAMP_LINEAR_MIP_LINEAR == null) {
Builder b = new Builder(rs);
b.setMinification(Value.LINEAR_MIP_LINEAR);
b.setMagnification(Value.LINEAR);
b.setWrapS(Value.CLAMP);
b.setWrapT(Value.CLAMP);
rs.mSampler_CLAMP_LINEAR_MIP_LINEAR = b.create();
}
return rs.mSampler_CLAMP_LINEAR_MIP_LINEAR;
}
/**
* Retrieve a sampler with min and mag set to nearest and wrap modes set to
* wrap.
*
* @param rs Context to which the sampler will belong.
*
* @return Sampler
*/
public static Sampler WRAP_NEAREST(RenderScript rs) {
if(rs.mSampler_WRAP_NEAREST == null) {
Builder b = new Builder(rs);
b.setMinification(Value.NEAREST);
b.setMagnification(Value.NEAREST);
b.setWrapS(Value.WRAP);
b.setWrapT(Value.WRAP);
rs.mSampler_WRAP_NEAREST = b.create();
}
return rs.mSampler_WRAP_NEAREST;
}
/**
* Retrieve a sampler with min and mag set to linear and wrap modes set to
* wrap.
*
* @param rs Context to which the sampler will belong.
*
* @return Sampler
*/
public static Sampler WRAP_LINEAR(RenderScript rs) {
if(rs.mSampler_WRAP_LINEAR == null) {
Builder b = new Builder(rs);
b.setMinification(Value.LINEAR);
b.setMagnification(Value.LINEAR);
b.setWrapS(Value.WRAP);
b.setWrapT(Value.WRAP);
rs.mSampler_WRAP_LINEAR = b.create();
}
return rs.mSampler_WRAP_LINEAR;
}
/**
* Retrieve a sampler with mag set to linear, min linear mipmap linear, and
* wrap modes set to wrap.
*
* @param rs Context to which the sampler will belong.
*
* @return Sampler
*/
public static Sampler WRAP_LINEAR_MIP_LINEAR(RenderScript rs) {
if(rs.mSampler_WRAP_LINEAR_MIP_LINEAR == null) {
Builder b = new Builder(rs);
b.setMinification(Value.LINEAR_MIP_LINEAR);
b.setMagnification(Value.LINEAR);
b.setWrapS(Value.WRAP);
b.setWrapT(Value.WRAP);
rs.mSampler_WRAP_LINEAR_MIP_LINEAR = b.create();
}
return rs.mSampler_WRAP_LINEAR_MIP_LINEAR;
}
/**
* Retrieve a sampler with min and mag set to nearest and wrap modes set to
* mirrored repeat.
*
* @param rs Context to which the sampler will belong.
*
* @return Sampler
*/
public static Sampler MIRRORED_REPEAT_NEAREST(RenderScript rs) {
if(rs.mSampler_MIRRORED_REPEAT_NEAREST == null) {
Builder b = new Builder(rs);
b.setMinification(Value.NEAREST);
b.setMagnification(Value.NEAREST);
b.setWrapS(Value.MIRRORED_REPEAT);
b.setWrapT(Value.MIRRORED_REPEAT);
rs.mSampler_MIRRORED_REPEAT_NEAREST = b.create();
}
return rs.mSampler_MIRRORED_REPEAT_NEAREST;
}
/**
* Retrieve a sampler with min and mag set to linear and wrap modes set to
* mirrored repeat.
*
* @param rs Context to which the sampler will belong.
*
* @return Sampler
*/
public static Sampler MIRRORED_REPEAT_LINEAR(RenderScript rs) {
if(rs.mSampler_MIRRORED_REPEAT_LINEAR == null) {
Builder b = new Builder(rs);
b.setMinification(Value.LINEAR);
b.setMagnification(Value.LINEAR);
b.setWrapS(Value.MIRRORED_REPEAT);
b.setWrapT(Value.MIRRORED_REPEAT);
rs.mSampler_MIRRORED_REPEAT_LINEAR = b.create();
}
return rs.mSampler_MIRRORED_REPEAT_LINEAR;
}
/**
* Retrieve a sampler with min and mag set to linear and wrap modes set to
* mirrored repeat.
*
* @param rs Context to which the sampler will belong.
*
* @return Sampler
*/
public static Sampler MIRRORED_REPEAT_LINEAR_MIP_LINEAR(RenderScript rs) {
if(rs.mSampler_MIRRORED_REPEAT_LINEAR_MIP_LINEAR == null) {
Builder b = new Builder(rs);
b.setMinification(Value.LINEAR_MIP_LINEAR);
b.setMagnification(Value.LINEAR);
b.setWrapS(Value.MIRRORED_REPEAT);
b.setWrapT(Value.MIRRORED_REPEAT);
rs.mSampler_MIRRORED_REPEAT_LINEAR_MIP_LINEAR = b.create();
}
return rs.mSampler_MIRRORED_REPEAT_LINEAR_MIP_LINEAR;
}
/**
* Builder for creating non-standard samplers. This is only necessary if
* a Sampler with different min and mag modes is desired.
*/
public static class Builder {
RenderScript mRS;
Value mMin;
Value mMag;
Value mWrapS;
Value mWrapT;
Value mWrapR;
float mAniso;
public Builder(RenderScript rs) {
mRS = rs;
mMin = Value.NEAREST;
mMag = Value.NEAREST;
mWrapS = Value.WRAP;
mWrapT = Value.WRAP;
mWrapR = Value.WRAP;
mAniso = 1.0f;
}
public void setMinification(Value v) {
if (v == Value.NEAREST ||
v == Value.LINEAR ||
v == Value.LINEAR_MIP_LINEAR ||
v == Value.LINEAR_MIP_NEAREST) {
mMin = v;
} else {
throw new IllegalArgumentException("Invalid value");
}
}
public void setMagnification(Value v) {
if (v == Value.NEAREST || v == Value.LINEAR) {
mMag = v;
} else {
throw new IllegalArgumentException("Invalid value");
}
}
public void setWrapS(Value v) {
if (v == Value.WRAP || v == Value.CLAMP || v == Value.MIRRORED_REPEAT) {
mWrapS = v;
} else {
throw new IllegalArgumentException("Invalid value");
}
}
public void setWrapT(Value v) {
if (v == Value.WRAP || v == Value.CLAMP || v == Value.MIRRORED_REPEAT) {
mWrapT = v;
} else {
throw new IllegalArgumentException("Invalid value");
}
}
public void setAnisotropy(float v) {
if(v >= 0.0f) {
mAniso = v;
} else {
throw new IllegalArgumentException("Invalid value");
}
}
public Sampler create() {
mRS.validate();
int id = mRS.nSamplerCreate(mMag.mID, mMin.mID,
mWrapS.mID, mWrapT.mID, mWrapR.mID, mAniso);
Sampler sampler = new Sampler(id, mRS);
sampler.mMin = mMin;
sampler.mMag = mMag;
sampler.mWrapS = mWrapS;
sampler.mWrapT = mWrapT;
sampler.mWrapR = mWrapR;
sampler.mAniso = mAniso;
return sampler;
}
}
}

View File

@@ -0,0 +1,464 @@
/*
* Copyright (C) 2008-2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.renderscript;
import android.util.SparseArray;
/**
* The parent class for all executable scripts. This should not be used by
* applications.
**/
public class Script extends BaseObj {
/**
* KernelID is an identifier for a Script + root function pair. It is used
* as an identifier for ScriptGroup creation.
*
* This class should not be directly created. Instead use the method in the
* reflected or intrinsic code "getKernelID_funcname()".
*
*/
public static final class KernelID extends BaseObj {
Script mScript;
int mSlot;
int mSig;
KernelID(long id, RenderScript rs, Script s, int slot, int sig) {
super(id, rs);
mScript = s;
mSlot = slot;
mSig = sig;
}
}
private final SparseArray<KernelID> mKIDs = new SparseArray<KernelID>();
/**
* Only to be used by generated reflected classes.
*/
protected KernelID createKernelID(int slot, int sig, Element ein, Element eout) {
KernelID k = mKIDs.get(slot);
if (k != null) {
return k;
}
long id = mRS.nScriptKernelIDCreate(getID(mRS), slot, sig);
if (id == 0) {
throw new RSDriverException("Failed to create KernelID");
}
k = new KernelID(id, mRS, this, slot, sig);
mKIDs.put(slot, k);
return k;
}
/**
* FieldID is an identifier for a Script + exported field pair. It is used
* as an identifier for ScriptGroup creation.
*
* This class should not be directly created. Instead use the method in the
* reflected or intrinsic code "getFieldID_funcname()".
*
*/
public static final class FieldID extends BaseObj {
Script mScript;
int mSlot;
FieldID(long id, RenderScript rs, Script s, int slot) {
super(id, rs);
mScript = s;
mSlot = slot;
}
}
private final SparseArray<FieldID> mFIDs = new SparseArray();
/**
* Only to be used by generated reflected classes.
*/
protected FieldID createFieldID(int slot, Element e) {
FieldID f = mFIDs.get(slot);
if (f != null) {
return f;
}
long id = mRS.nScriptFieldIDCreate(getID(mRS), slot);
if (id == 0) {
throw new RSDriverException("Failed to create FieldID");
}
f = new FieldID(id, mRS, this, slot);
mFIDs.put(slot, f);
return f;
}
/**
* Only intended for use by generated reflected code.
*
*/
protected void invoke(int slot) {
mRS.nScriptInvoke(getID(mRS), slot);
}
/**
* Only intended for use by generated reflected code.
*
*/
protected void invoke(int slot, FieldPacker v) {
if (v != null) {
mRS.nScriptInvokeV(getID(mRS), slot, v.getData());
} else {
mRS.nScriptInvoke(getID(mRS), slot);
}
}
/**
* Only intended for use by generated reflected code.
*
*/
protected void forEach(int slot, Allocation ain, Allocation aout, FieldPacker v) {
if (ain == null && aout == null) {
throw new RSIllegalArgumentException(
"At least one of ain or aout is required to be non-null.");
}
long in_id = 0;
if (ain != null) {
in_id = ain.getID(mRS);
}
long out_id = 0;
if (aout != null) {
out_id = aout.getID(mRS);
}
byte[] params = null;
if (v != null) {
params = v.getData();
}
mRS.nScriptForEach(getID(mRS), slot, in_id, out_id, params);
}
/**
* Only intended for use by generated reflected code.
*
*/
protected void forEach(int slot, Allocation ain, Allocation aout, FieldPacker v, LaunchOptions sc) {
if (ain == null && aout == null) {
throw new RSIllegalArgumentException(
"At least one of ain or aout is required to be non-null.");
}
if (sc == null) {
forEach(slot, ain, aout, v);
return;
}
long in_id = 0;
if (ain != null) {
in_id = ain.getID(mRS);
}
long out_id = 0;
if (aout != null) {
out_id = aout.getID(mRS);
}
byte[] params = null;
if (v != null) {
params = v.getData();
}
mRS.nScriptForEachClipped(getID(mRS), slot, in_id, out_id, params, sc.xstart, sc.xend, sc.ystart, sc.yend, sc.zstart, sc.zend);
}
Script(long id, RenderScript rs) {
super(id, rs);
}
/**
* Only intended for use by generated reflected code.
*
*/
public void bindAllocation(Allocation va, int slot) {
mRS.validate();
if (va != null) {
mRS.nScriptBindAllocation(getID(mRS), va.getID(mRS), slot);
} else {
mRS.nScriptBindAllocation(getID(mRS), 0, slot);
}
}
/**
* Only intended for use by generated reflected code.
*
*/
public void setVar(int index, float v) {
mRS.nScriptSetVarF(getID(mRS), index, v);
}
public float getVarF(int index) {
return mRS.nScriptGetVarF(getID(mRS), index);
}
/**
* Only intended for use by generated reflected code.
*
*/
public void setVar(int index, double v) {
mRS.nScriptSetVarD(getID(mRS), index, v);
}
public double getVarD(int index) {
return mRS.nScriptGetVarD(getID(mRS), index);
}
/**
* Only intended for use by generated reflected code.
*
*/
public void setVar(int index, int v) {
mRS.nScriptSetVarI(getID(mRS), index, v);
}
public int getVarI(int index) {
return mRS.nScriptGetVarI(getID(mRS), index);
}
/**
* Only intended for use by generated reflected code.
*
*/
public void setVar(int index, long v) {
mRS.nScriptSetVarJ(getID(mRS), index, v);
}
public long getVarJ(int index) {
return mRS.nScriptGetVarJ(getID(mRS), index);
}
/**
* Only intended for use by generated reflected code.
*
*/
public void setVar(int index, boolean v) {
mRS.nScriptSetVarI(getID(mRS), index, v ? 1 : 0);
}
public boolean getVarB(int index) {
return mRS.nScriptGetVarI(getID(mRS), index) > 0 ? true : false;
}
/**
* Only intended for use by generated reflected code.
*
*/
public void setVar(int index, BaseObj o) {
mRS.nScriptSetVarObj(getID(mRS), index, (o == null) ? 0 : o.getID(mRS));
}
/**
* Only intended for use by generated reflected code.
*
*/
public void setVar(int index, FieldPacker v) {
mRS.nScriptSetVarV(getID(mRS), index, v.getData());
}
/**
* Only intended for use by generated reflected code.
*
*/
public void setVar(int index, FieldPacker v, Element e, int[] dims) {
mRS.nScriptSetVarVE(getID(mRS), index, v.getData(), e.getID(mRS), dims);
}
/**
* Only intended for use by generated reflected code.
*
*/
public void getVarV(int index, FieldPacker v) {
mRS.nScriptGetVarV(getID(mRS), index, v.getData());
}
public void setTimeZone(String timeZone) {
mRS.validate();
try {
mRS.nScriptSetTimeZone(getID(mRS), timeZone.getBytes("UTF-8"));
} catch (java.io.UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
/**
* Only intended for use by generated reflected code.
*
*/
public static class Builder {
RenderScript mRS;
Builder(RenderScript rs) {
mRS = rs;
}
}
/**
* Only intended for use by generated reflected code.
*
*/
public static class FieldBase {
protected Element mElement;
protected Allocation mAllocation;
protected void init(RenderScript rs, int dimx) {
mAllocation = Allocation.createSized(rs, mElement, dimx, Allocation.USAGE_SCRIPT);
}
protected void init(RenderScript rs, int dimx, int usages) {
mAllocation = Allocation.createSized(rs, mElement, dimx, Allocation.USAGE_SCRIPT | usages);
}
protected FieldBase() {
}
public Element getElement() {
return mElement;
}
public Type getType() {
return mAllocation.getType();
}
public Allocation getAllocation() {
return mAllocation;
}
//@Override
public void updateAllocation() {
}
}
/**
* Class used to specify clipping for a kernel launch.
*
*/
public static final class LaunchOptions {
private int xstart = 0;
private int ystart = 0;
private int xend = 0;
private int yend = 0;
private int zstart = 0;
private int zend = 0;
private int strategy;
/**
* Set the X range. If the end value is set to 0 the X dimension is not
* clipped.
*
* @param xstartArg Must be >= 0
* @param xendArg Must be >= xstartArg
*
* @return LaunchOptions
*/
public LaunchOptions setX(int xstartArg, int xendArg) {
if (xstartArg < 0 || xendArg <= xstartArg) {
throw new RSIllegalArgumentException("Invalid dimensions");
}
xstart = xstartArg;
xend = xendArg;
return this;
}
/**
* Set the Y range. If the end value is set to 0 the Y dimension is not
* clipped.
*
* @param ystartArg Must be >= 0
* @param yendArg Must be >= ystartArg
*
* @return LaunchOptions
*/
public LaunchOptions setY(int ystartArg, int yendArg) {
if (ystartArg < 0 || yendArg <= ystartArg) {
throw new RSIllegalArgumentException("Invalid dimensions");
}
ystart = ystartArg;
yend = yendArg;
return this;
}
/**
* Set the Z range. If the end value is set to 0 the Z dimension is not
* clipped.
*
* @param zstartArg Must be >= 0
* @param zendArg Must be >= zstartArg
*
* @return LaunchOptions
*/
public LaunchOptions setZ(int zstartArg, int zendArg) {
if (zstartArg < 0 || zendArg <= zstartArg) {
throw new RSIllegalArgumentException("Invalid dimensions");
}
zstart = zstartArg;
zend = zendArg;
return this;
}
/**
* Returns the current X start
*
* @return int current value
*/
public int getXStart() {
return xstart;
}
/**
* Returns the current X end
*
* @return int current value
*/
public int getXEnd() {
return xend;
}
/**
* Returns the current Y start
*
* @return int current value
*/
public int getYStart() {
return ystart;
}
/**
* Returns the current Y end
*
* @return int current value
*/
public int getYEnd() {
return yend;
}
/**
* Returns the current Z start
*
* @return int current value
*/
public int getZStart() {
return zstart;
}
/**
* Returns the current Z end
*
* @return int current value
*/
public int getZEnd() {
return zend;
}
}
}

View File

@@ -0,0 +1,106 @@
/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.renderscript;
import android.content.res.Resources;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
/**
* The superclass for all user-defined scripts. This is only
* intended to be used by the generated derived classes.
**/
public class ScriptC extends Script {
private static final String TAG = "ScriptC";
/**
* Only intended for use by the generated derived classes.
*
* @param id
* @param rs
*/
protected ScriptC(int id, RenderScript rs) {
super(id, rs);
}
/**
* Only intended for use by the generated derived classes.
*
*
* @param rs
* @param resources
* @param resourceID
*/
protected ScriptC(RenderScript rs, Resources resources, int resourceID) {
super(0, rs);
int id = internalCreate(rs, resources, resourceID);
if (id == 0) {
throw new RSRuntimeException("Loading of ScriptC script failed.");
}
setID(id);
}
/**
* Name of the file that holds the object cache.
*/
private static final String CACHE_PATH = "com.android.renderscript.cache";
static String mCachePath;
private static synchronized int internalCreate(RenderScript rs, Resources resources, int resourceID) {
byte[] pgm;
int pgmLength;
InputStream is = resources.openRawResource(resourceID);
try {
try {
pgm = new byte[1024];
pgmLength = 0;
while(true) {
int bytesLeft = pgm.length - pgmLength;
if (bytesLeft == 0) {
byte[] buf2 = new byte[pgm.length * 2];
System.arraycopy(pgm, 0, buf2, 0, pgm.length);
pgm = buf2;
bytesLeft = pgm.length - pgmLength;
}
int bytesRead = is.read(pgm, pgmLength, bytesLeft);
if (bytesRead <= 0) {
break;
}
pgmLength += bytesRead;
}
} finally {
is.close();
}
} catch(IOException e) {
throw new Resources.NotFoundException();
}
String resName = resources.getResourceEntryName(resourceID);
// Create the RS cache path if we haven't done so already.
if (mCachePath == null) {
File f = new File(rs.mCacheDir, CACHE_PATH);
mCachePath = f.getAbsolutePath();
f.mkdirs();
}
// Log.v(TAG, "Create script for resource = " + resName);
return rs.nScriptCCreate(resName, mCachePath, pgm, pgmLength);
}
}

View File

@@ -0,0 +1,471 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.renderscript;
import java.util.ArrayList;
/**
* ScriptGroup creates a group of kernels that are executed
* together with one execution call as if they were a single kernel.
* The kernels may be connected internally or to an external allocation.
* The intermediate results for internal connections are not observable
* after the execution of the script.
* <p>
* External connections are grouped into inputs and outputs.
* All outputs are produced by a script kernel and placed into a
* user-supplied allocation. Inputs provide the input of a kernel.
* Inputs bound to script globals are set directly upon the script.
* <p>
* A ScriptGroup must contain at least one kernel. A ScriptGroup
* must contain only a single directed acyclic graph (DAG) of
* script kernels and connections. Attempting to create a
* ScriptGroup with multiple DAGs or attempting to create
* a cycle within a ScriptGroup will throw an exception.
* <p>
* Currently, all kernels in a ScriptGroup must be from separate
* Script objects. Attempting to use multiple kernels from the same
* Script object will result in an {@link android.renderscript.RSInvalidStateException}.
*
**/
public final class ScriptGroup extends BaseObj {
IO mOutputs[];
IO mInputs[];
static class IO {
Script.KernelID mKID;
Allocation mAllocation;
IO(Script.KernelID s) {
mKID = s;
}
}
static class ConnectLine {
ConnectLine(Type t, Script.KernelID from, Script.KernelID to) {
mFrom = from;
mToK = to;
mAllocationType = t;
}
ConnectLine(Type t, Script.KernelID from, Script.FieldID to) {
mFrom = from;
mToF = to;
mAllocationType = t;
}
Script.FieldID mToF;
Script.KernelID mToK;
Script.KernelID mFrom;
Type mAllocationType;
}
static class Node {
Script mScript;
ArrayList<Script.KernelID> mKernels = new ArrayList<Script.KernelID>();
ArrayList<ConnectLine> mInputs = new ArrayList<ConnectLine>();
ArrayList<ConnectLine> mOutputs = new ArrayList<ConnectLine>();
int dagNumber;
Node mNext;
Node(Script s) {
mScript = s;
}
}
ScriptGroup(long id, RenderScript rs) {
super(id, rs);
}
/**
* Sets an input of the ScriptGroup. This specifies an
* Allocation to be used for kernels that require an input
* Allocation provided from outside of the ScriptGroup.
*
* @param s The ID of the kernel where the allocation should be
* connected.
* @param a The allocation to connect.
*/
public void setInput(Script.KernelID s, Allocation a) {
for (int ct=0; ct < mInputs.length; ct++) {
if (mInputs[ct].mKID == s) {
mInputs[ct].mAllocation = a;
mRS.nScriptGroupSetInput(getID(mRS), s.getID(mRS), mRS.safeID(a));
return;
}
}
throw new RSIllegalArgumentException("Script not found");
}
/**
* Sets an output of the ScriptGroup. This specifies an
* Allocation to be used for the kernels that require an output
* Allocation visible after the ScriptGroup is executed.
*
* @param s The ID of the kernel where the allocation should be
* connected.
* @param a The allocation to connect.
*/
public void setOutput(Script.KernelID s, Allocation a) {
for (int ct=0; ct < mOutputs.length; ct++) {
if (mOutputs[ct].mKID == s) {
mOutputs[ct].mAllocation = a;
mRS.nScriptGroupSetOutput(getID(mRS), s.getID(mRS), mRS.safeID(a));
return;
}
}
throw new RSIllegalArgumentException("Script not found");
}
/**
* Execute the ScriptGroup. This will run all the kernels in
* the ScriptGroup. No internal connection results will be visible
* after execution of the ScriptGroup.
*/
public void execute() {
mRS.nScriptGroupExecute(getID(mRS));
}
/**
* Helper class to build a ScriptGroup. A ScriptGroup is
* created in two steps.
* <p>
* First, all kernels to be used by the ScriptGroup should be added.
* <p>
* Second, add connections between kernels. There are two types
* of connections: kernel to kernel and kernel to field.
* Kernel to kernel allows a kernel's output to be passed to
* another kernel as input. Kernel to field allows the output of
* one kernel to be bound as a script global. Kernel to kernel is
* higher performance and should be used where possible.
* <p>
* A ScriptGroup must contain a single directed acyclic graph (DAG); it
* cannot contain cycles. Currently, all kernels used in a ScriptGroup
* must come from different Script objects. Additionally, all kernels
* in a ScriptGroup must have at least one input, output, or internal
* connection.
* <p>
* Once all connections are made, a call to {@link #create} will
* return the ScriptGroup object.
*
*/
public static final class Builder {
private RenderScript mRS;
private ArrayList<Node> mNodes = new ArrayList<Node>();
private ArrayList<ConnectLine> mLines = new ArrayList<ConnectLine>();
private int mKernelCount;
/**
* Create a Builder for generating a ScriptGroup.
*
*
* @param rs The RenderScript context.
*/
public Builder(RenderScript rs) {
mRS = rs;
}
// do a DFS from original node, looking for original node
// any cycle that could be created must contain original node
private void validateCycle(Node target, Node original) {
for (int ct = 0; ct < target.mOutputs.size(); ct++) {
final ConnectLine cl = target.mOutputs.get(ct);
if (cl.mToK != null) {
Node tn = findNode(cl.mToK.mScript);
if (tn.equals(original)) {
throw new RSInvalidStateException("Loops in group not allowed.");
}
validateCycle(tn, original);
}
if (cl.mToF != null) {
Node tn = findNode(cl.mToF.mScript);
if (tn.equals(original)) {
throw new RSInvalidStateException("Loops in group not allowed.");
}
validateCycle(tn, original);
}
}
}
private void mergeDAGs(int valueUsed, int valueKilled) {
for (int ct=0; ct < mNodes.size(); ct++) {
if (mNodes.get(ct).dagNumber == valueKilled)
mNodes.get(ct).dagNumber = valueUsed;
}
}
private void validateDAGRecurse(Node n, int dagNumber) {
// combine DAGs if this node has been seen already
if (n.dagNumber != 0 && n.dagNumber != dagNumber) {
mergeDAGs(n.dagNumber, dagNumber);
return;
}
n.dagNumber = dagNumber;
for (int ct=0; ct < n.mOutputs.size(); ct++) {
final ConnectLine cl = n.mOutputs.get(ct);
if (cl.mToK != null) {
Node tn = findNode(cl.mToK.mScript);
validateDAGRecurse(tn, dagNumber);
}
if (cl.mToF != null) {
Node tn = findNode(cl.mToF.mScript);
validateDAGRecurse(tn, dagNumber);
}
}
}
private void validateDAG() {
for (int ct=0; ct < mNodes.size(); ct++) {
Node n = mNodes.get(ct);
if (n.mInputs.size() == 0) {
if (n.mOutputs.size() == 0 && mNodes.size() > 1) {
throw new RSInvalidStateException("Groups cannot contain unconnected scripts");
}
validateDAGRecurse(n, ct+1);
}
}
int dagNumber = mNodes.get(0).dagNumber;
for (int ct=0; ct < mNodes.size(); ct++) {
if (mNodes.get(ct).dagNumber != dagNumber) {
throw new RSInvalidStateException("Multiple DAGs in group not allowed.");
}
}
}
private Node findNode(Script s) {
for (int ct=0; ct < mNodes.size(); ct++) {
if (s == mNodes.get(ct).mScript) {
return mNodes.get(ct);
}
}
return null;
}
private Node findNode(Script.KernelID k) {
for (int ct=0; ct < mNodes.size(); ct++) {
Node n = mNodes.get(ct);
for (int ct2=0; ct2 < n.mKernels.size(); ct2++) {
if (k == n.mKernels.get(ct2)) {
return n;
}
}
}
return null;
}
/**
* Adds a Kernel to the group.
*
*
* @param k The kernel to add.
*
* @return Builder Returns this.
*/
public Builder addKernel(Script.KernelID k) {
if (mLines.size() != 0) {
throw new RSInvalidStateException(
"Kernels may not be added once connections exist.");
}
//android.util.Log.v("RSR", "addKernel 1 k=" + k);
if (findNode(k) != null) {
return this;
}
//android.util.Log.v("RSR", "addKernel 2 ");
mKernelCount++;
Node n = findNode(k.mScript);
if (n == null) {
//android.util.Log.v("RSR", "addKernel 3 ");
n = new Node(k.mScript);
mNodes.add(n);
}
n.mKernels.add(k);
return this;
}
/**
* Adds a connection to the group.
*
*
* @param t The type of the connection. This is used to
* determine the kernel launch sizes on the source side
* of this connection.
* @param from The source for the connection.
* @param to The destination of the connection.
*
* @return Builder Returns this
*/
public Builder addConnection(Type t, Script.KernelID from, Script.FieldID to) {
//android.util.Log.v("RSR", "addConnection " + t +", " + from + ", " + to);
Node nf = findNode(from);
if (nf == null) {
throw new RSInvalidStateException("From script not found.");
}
Node nt = findNode(to.mScript);
if (nt == null) {
throw new RSInvalidStateException("To script not found.");
}
ConnectLine cl = new ConnectLine(t, from, to);
mLines.add(new ConnectLine(t, from, to));
nf.mOutputs.add(cl);
nt.mInputs.add(cl);
validateCycle(nf, nf);
return this;
}
/**
* Adds a connection to the group.
*
*
* @param t The type of the connection. This is used to
* determine the kernel launch sizes for both sides of
* this connection.
* @param from The source for the connection.
* @param to The destination of the connection.
*
* @return Builder Returns this
*/
public Builder addConnection(Type t, Script.KernelID from, Script.KernelID to) {
//android.util.Log.v("RSR", "addConnection " + t +", " + from + ", " + to);
Node nf = findNode(from);
if (nf == null) {
throw new RSInvalidStateException("From script not found.");
}
Node nt = findNode(to);
if (nt == null) {
throw new RSInvalidStateException("To script not found.");
}
ConnectLine cl = new ConnectLine(t, from, to);
mLines.add(new ConnectLine(t, from, to));
nf.mOutputs.add(cl);
nt.mInputs.add(cl);
validateCycle(nf, nf);
return this;
}
/**
* Creates the Script group.
*
*
* @return ScriptGroup The new ScriptGroup
*/
public ScriptGroup create() {
// FIXME: this is broken for 64-bit
if (mNodes.size() == 0) {
throw new RSInvalidStateException("Empty script groups are not allowed");
}
// reset DAG numbers in case we're building a second group
for (int ct=0; ct < mNodes.size(); ct++) {
mNodes.get(ct).dagNumber = 0;
}
validateDAG();
ArrayList<IO> inputs = new ArrayList<IO>();
ArrayList<IO> outputs = new ArrayList<IO>();
int[] kernels = new int[mKernelCount];
int idx = 0;
for (int ct=0; ct < mNodes.size(); ct++) {
Node n = mNodes.get(ct);
for (int ct2=0; ct2 < n.mKernels.size(); ct2++) {
final Script.KernelID kid = n.mKernels.get(ct2);
kernels[idx++] = (int)kid.getID(mRS);
boolean hasInput = false;
boolean hasOutput = false;
for (int ct3=0; ct3 < n.mInputs.size(); ct3++) {
if (n.mInputs.get(ct3).mToK == kid) {
hasInput = true;
}
}
for (int ct3=0; ct3 < n.mOutputs.size(); ct3++) {
if (n.mOutputs.get(ct3).mFrom == kid) {
hasOutput = true;
}
}
if (!hasInput) {
inputs.add(new IO(kid));
}
if (!hasOutput) {
outputs.add(new IO(kid));
}
}
}
if (idx != mKernelCount) {
throw new RSRuntimeException("Count mismatch, should not happen.");
}
int[] src = new int[mLines.size()];
int[] dstk = new int[mLines.size()];
int[] dstf = new int[mLines.size()];
int[] types = new int[mLines.size()];
for (int ct=0; ct < mLines.size(); ct++) {
ConnectLine cl = mLines.get(ct);
src[ct] = (int)cl.mFrom.getID(mRS);
if (cl.mToK != null) {
dstk[ct] = (int)cl.mToK.getID(mRS);
}
if (cl.mToF != null) {
dstf[ct] = (int)cl.mToF.getID(mRS);
}
types[ct] = (int)cl.mAllocationType.getID(mRS);
}
long id = mRS.nScriptGroupCreate(kernels, src, dstk, dstf, types);
if (id == 0) {
throw new RSRuntimeException("Object creation error, should not happen.");
}
ScriptGroup sg = new ScriptGroup(id, mRS);
sg.mOutputs = new IO[outputs.size()];
for (int ct=0; ct < outputs.size(); ct++) {
sg.mOutputs[ct] = outputs.get(ct);
}
sg.mInputs = new IO[inputs.size()];
for (int ct=0; ct < inputs.size(); ct++) {
sg.mInputs[ct] = inputs.get(ct);
}
return sg;
}
}
}

View File

@@ -0,0 +1,31 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.renderscript;
/**
* Base class for all Intrinsic scripts. An intrinsic a script
* which implements a pre-defined function. Intrinsics are
* provided to provide effecient implemtations of common
* operations.
*
* Not intended for direct use.
**/
public abstract class ScriptIntrinsic extends Script {
ScriptIntrinsic(long id, RenderScript rs) {
super(id, rs);
}
}

View File

@@ -0,0 +1,99 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.renderscript;
/**
*
* Intrinsic for converting RGB to RGBA by using a 3D lookup table. The
* incoming r,g,b values are use as normalized x,y,z coordinates into a 3D
* allocation. The 8 nearest values are sampled and linearly interpolated. The
* result is placed in the output.
*
**/
public final class ScriptIntrinsic3DLUT extends ScriptIntrinsic {
private Allocation mLUT;
private Element mElement;
private ScriptIntrinsic3DLUT(long id, RenderScript rs, Element e) {
super(id, rs);
mElement = e;
}
/**
* Supported elements types are {@link Element#U8_4}
*
* The defaults tables are identity.
*
* @param rs The RenderScript context
* @param e Element type for intputs and outputs
*
* @return ScriptIntrinsic3DLUT
*/
public static ScriptIntrinsic3DLUT create(RenderScript rs, Element e) {
long id = rs.nScriptIntrinsicCreate(8, e.getID(rs));
if (!e.isCompatible(Element.U8_4(rs))) {
throw new RSIllegalArgumentException("Element must be compatible with uchar4.");
}
return new ScriptIntrinsic3DLUT(id, rs, e);
}
/**
* Sets the {@link android.renderscript.Allocation} to be used as the lookup table.
*
* The lookup table must use the same {@link android.renderscript.Element} as the intrinsic.
*
*/
public void setLUT(Allocation lut) {
final Type t = lut.getType();
if (t.getZ() == 0) {
throw new RSIllegalArgumentException("LUT must be 3d.");
}
if (!t.getElement().isCompatible(mElement)) {
throw new RSIllegalArgumentException("LUT element type must match.");
}
mLUT = lut;
setVar(0, mLUT);
}
/**
* Invoke the kernel and apply the lookup to each cell of ain
* and copy to aout.
*
* @param ain Input allocation
* @param aout Output allocation
*/
public void forEach(Allocation ain, Allocation aout) {
forEach(0, ain, aout, null);
}
/**
* Get a KernelID for this intrinsic kernel.
*
* @return Script.KernelID The KernelID object.
*/
public Script.KernelID getKernelID() {
return createKernelID(0, 3, null, null);
}
}

View File

@@ -0,0 +1,464 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.renderscript;
/**
* Intrinsic kernels for blending two {@link android.renderscript.Allocation} objects.
**/
public class ScriptIntrinsicBlend extends ScriptIntrinsic {
ScriptIntrinsicBlend(long id, RenderScript rs) {
super(id, rs);
}
/**
* Supported elements types are {@link Element#U8_4}
*
* @param rs The RenderScript context
* @param e Element type for inputs and outputs
*
* @return ScriptIntrinsicBlend
*/
public static ScriptIntrinsicBlend create(RenderScript rs, Element e) {
// 7 comes from RS_SCRIPT_INTRINSIC_ID_BLEND in rsDefines.h
long id = rs.nScriptIntrinsicCreate(7, e.getID(rs));
return new ScriptIntrinsicBlend(id, rs);
}
private void blend(int id, Allocation ain, Allocation aout) {
if (!ain.getElement().isCompatible(Element.U8_4(mRS))) {
throw new RSIllegalArgumentException("Input is not of expected format.");
}
if (!aout.getElement().isCompatible(Element.U8_4(mRS))) {
throw new RSIllegalArgumentException("Output is not of expected format.");
}
forEach(id, ain, aout, null);
}
/**
* Sets dst = {0, 0, 0, 0}
*
* @param ain The source buffer
* @param aout The destination buffer
*/
public void forEachClear(Allocation ain, Allocation aout) {
blend(0, ain, aout);
}
/**
* Get a KernelID for the Clear kernel.
*
* @return Script.KernelID The KernelID object.
*/
public Script.KernelID getKernelIDClear() {
return createKernelID(0, 3, null, null);
}
/**
* Sets dst = src
*
* @param ain The source buffer
* @param aout The destination buffer
*/
public void forEachSrc(Allocation ain, Allocation aout) {
blend(1, ain, aout);
}
/**
* Get a KernelID for the Src kernel.
*
* @return Script.KernelID The KernelID object.
*/
public Script.KernelID getKernelIDSrc() {
return createKernelID(1, 3, null, null);
}
/**
* Sets dst = dst
*
* This is a NOP.
*
* @param ain The source buffer
* @param aout The destination buffer
*/
public void forEachDst(Allocation ain, Allocation aout) {
// NOP
}
/**
* Get a KernelID for the Dst kernel.
*
* @return Script.KernelID The KernelID object.
*/
public Script.KernelID getKernelIDDst() {
return createKernelID(2, 3, null, null);
}
/**
* Sets dst = src + dst * (1.0 - src.a)
*
* @param ain The source buffer
* @param aout The destination buffer
*/
public void forEachSrcOver(Allocation ain, Allocation aout) {
blend(3, ain, aout);
}
/**
* Get a KernelID for the SrcOver kernel.
*
* @return Script.KernelID The KernelID object.
*/
public Script.KernelID getKernelIDSrcOver() {
return createKernelID(3, 3, null, null);
}
/**
* Sets dst = dst + src * (1.0 - dst.a)
*
* @param ain The source buffer
* @param aout The destination buffer
*/
public void forEachDstOver(Allocation ain, Allocation aout) {
blend(4, ain, aout);
}
/**
* Get a KernelID for the DstOver kernel.
*
* @return Script.KernelID The KernelID object.
*/
public Script.KernelID getKernelIDDstOver() {
return createKernelID(4, 3, null, null);
}
/**
* Sets dst = src * dst.a
*
* @param ain The source buffer
* @param aout The destination buffer
*/
public void forEachSrcIn(Allocation ain, Allocation aout) {
blend(5, ain, aout);
}
/**
* Get a KernelID for the SrcIn kernel.
*
* @return Script.KernelID The KernelID object.
*/
public Script.KernelID getKernelIDSrcIn() {
return createKernelID(5, 3, null, null);
}
/**
* Sets dst = dst * src.a
*
* @param ain The source buffer
* @param aout The destination buffer
*/
public void forEachDstIn(Allocation ain, Allocation aout) {
blend(6, ain, aout);
}
/**
* Get a KernelID for the DstIn kernel.
*
* @return Script.KernelID The KernelID object.
*/
public Script.KernelID getKernelIDDstIn() {
return createKernelID(6, 3, null, null);
}
/**
* Sets dst = src * (1.0 - dst.a)
*
* @param ain The source buffer
* @param aout The destination buffer
*/
public void forEachSrcOut(Allocation ain, Allocation aout) {
blend(7, ain, aout);
}
/**
* Get a KernelID for the SrcOut kernel.
*
* @return Script.KernelID The KernelID object.
*/
public Script.KernelID getKernelIDSrcOut() {
return createKernelID(7, 3, null, null);
}
/**
* Sets dst = dst * (1.0 - src.a)
*
* @param ain The source buffer
* @param aout The destination buffer
*/
public void forEachDstOut(Allocation ain, Allocation aout) {
blend(8, ain, aout);
}
/**
* Get a KernelID for the DstOut kernel.
*
* @return Script.KernelID The KernelID object.
*/
public Script.KernelID getKernelIDDstOut() {
return createKernelID(8, 3, null, null);
}
/**
* dst.rgb = src.rgb * dst.a + (1.0 - src.a) * dst.rgb
* dst.a = dst.a
*
* @param ain The source buffer
* @param aout The destination buffer
*/
public void forEachSrcAtop(Allocation ain, Allocation aout) {
blend(9, ain, aout);
}
/**
* Get a KernelID for the SrcAtop kernel.
*
* @return Script.KernelID The KernelID object.
*/
public Script.KernelID getKernelIDSrcAtop() {
return createKernelID(9, 3, null, null);
}
/**
* dst = dst.rgb * src.a + (1.0 - dst.a) * src.rgb
* dst.a = src.a
*
* @param ain The source buffer
* @param aout The destination buffer
*/
public void forEachDstAtop(Allocation ain, Allocation aout) {
blend(10, ain, aout);
}
/**
* Get a KernelID for the DstAtop kernel.
*
* @return Script.KernelID The KernelID object.
*/
public Script.KernelID getKernelIDDstAtop() {
return createKernelID(10, 3, null, null);
}
/**
* Sets dst = {src.r ^ dst.r, src.g ^ dst.g, src.b ^ dst.b, src.a ^ dst.a}
*
* @param ain The source buffer
* @param aout The destination buffer
*/
public void forEachXor(Allocation ain, Allocation aout) {
blend(11, ain, aout);
}
/**
* Get a KernelID for the Xor kernel.
*
* @return Script.KernelID The KernelID object.
*/
public Script.KernelID getKernelIDXor() {
return createKernelID(11, 3, null, null);
}
////////
/*
public void forEachNormal(Allocation ain, Allocation aout) {
blend(12, ain, aout);
}
public void forEachAverage(Allocation ain, Allocation aout) {
blend(13, ain, aout);
}
*/
/**
* Sets dst = src * dst
*
* @param ain The source buffer
* @param aout The destination buffer
*/
public void forEachMultiply(Allocation ain, Allocation aout) {
blend(14, ain, aout);
}
/**
* Get a KernelID for the Multiply kernel.
*
* @return Script.KernelID The KernelID object.
*/
public Script.KernelID getKernelIDMultiply() {
return createKernelID(14, 3, null, null);
}
/*
public void forEachScreen(Allocation ain, Allocation aout) {
blend(15, ain, aout);
}
public void forEachDarken(Allocation ain, Allocation aout) {
blend(16, ain, aout);
}
public void forEachLighten(Allocation ain, Allocation aout) {
blend(17, ain, aout);
}
public void forEachOverlay(Allocation ain, Allocation aout) {
blend(18, ain, aout);
}
public void forEachHardlight(Allocation ain, Allocation aout) {
blend(19, ain, aout);
}
public void forEachSoftlight(Allocation ain, Allocation aout) {
blend(20, ain, aout);
}
public void forEachDifference(Allocation ain, Allocation aout) {
blend(21, ain, aout);
}
public void forEachNegation(Allocation ain, Allocation aout) {
blend(22, ain, aout);
}
public void forEachExclusion(Allocation ain, Allocation aout) {
blend(23, ain, aout);
}
public void forEachColorDodge(Allocation ain, Allocation aout) {
blend(24, ain, aout);
}
public void forEachInverseColorDodge(Allocation ain, Allocation aout) {
blend(25, ain, aout);
}
public void forEachSoftDodge(Allocation ain, Allocation aout) {
blend(26, ain, aout);
}
public void forEachColorBurn(Allocation ain, Allocation aout) {
blend(27, ain, aout);
}
public void forEachInverseColorBurn(Allocation ain, Allocation aout) {
blend(28, ain, aout);
}
public void forEachSoftBurn(Allocation ain, Allocation aout) {
blend(29, ain, aout);
}
public void forEachReflect(Allocation ain, Allocation aout) {
blend(30, ain, aout);
}
public void forEachGlow(Allocation ain, Allocation aout) {
blend(31, ain, aout);
}
public void forEachFreeze(Allocation ain, Allocation aout) {
blend(32, ain, aout);
}
public void forEachHeat(Allocation ain, Allocation aout) {
blend(33, ain, aout);
}
*/
/**
* Sets dst = min(src + dst, 1.0)
*
* @param ain The source buffer
* @param aout The destination buffer
*/
public void forEachAdd(Allocation ain, Allocation aout) {
blend(34, ain, aout);
}
/**
* Get a KernelID for the Add kernel.
*
* @return Script.KernelID The KernelID object.
*/
public Script.KernelID getKernelIDAdd() {
return createKernelID(34, 3, null, null);
}
/**
* Sets dst = max(dst - src, 0.0)
*
* @param ain The source buffer
* @param aout The destination buffer
*/
public void forEachSubtract(Allocation ain, Allocation aout) {
blend(35, ain, aout);
}
/**
* Get a KernelID for the Subtract kernel.
*
* @return Script.KernelID The KernelID object.
*/
public Script.KernelID getKernelIDSubtract() {
return createKernelID(35, 3, null, null);
}
/*
public void forEachStamp(Allocation ain, Allocation aout) {
blend(36, ain, aout);
}
public void forEachRed(Allocation ain, Allocation aout) {
blend(37, ain, aout);
}
public void forEachGreen(Allocation ain, Allocation aout) {
blend(38, ain, aout);
}
public void forEachBlue(Allocation ain, Allocation aout) {
blend(39, ain, aout);
}
public void forEachHue(Allocation ain, Allocation aout) {
blend(40, ain, aout);
}
public void forEachSaturation(Allocation ain, Allocation aout) {
blend(41, ain, aout);
}
public void forEachColor(Allocation ain, Allocation aout) {
blend(42, ain, aout);
}
public void forEachLuminosity(Allocation ain, Allocation aout) {
blend(43, ain, aout);
}
*/
}

View File

@@ -0,0 +1,108 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.renderscript;
/**
* Intrinsic Gausian blur filter. Applies a gaussian blur of the
* specified radius to all elements of an allocation.
*
*
**/
public final class ScriptIntrinsicBlur extends ScriptIntrinsic {
private final float[] mValues = new float[9];
private Allocation mInput;
private ScriptIntrinsicBlur(long id, RenderScript rs) {
super(id, rs);
}
/**
* Create an intrinsic for applying a blur to an allocation. The
* default radius is 5.0.
*
* Supported elements types are {@link Element#U8_4}
*
* @param rs The RenderScript context
* @param e Element type for inputs and outputs
*
* @return ScriptIntrinsicBlur
*/
public static ScriptIntrinsicBlur create(RenderScript rs, Element e) {
if ((!e.isCompatible(Element.U8_4(rs))) && (!e.isCompatible(Element.U8(rs)))) {
throw new RSIllegalArgumentException("Unsuported element type.");
}
long id = rs.nScriptIntrinsicCreate(5, e.getID(rs));
ScriptIntrinsicBlur sib = new ScriptIntrinsicBlur(id, rs);
sib.setRadius(5.f);
return sib;
}
/**
* Set the input of the blur.
* Must match the element type supplied during create.
*
* @param ain The input allocation
*/
public void setInput(Allocation ain) {
mInput = ain;
setVar(1, ain);
}
/**
* Set the radius of the Blur.
*
* Supported range 0 < radius <= 25
*
* @param radius The radius of the blur
*/
public void setRadius(float radius) {
if (radius <= 0 || radius > 25) {
throw new RSIllegalArgumentException("Radius out of range (0 < r <= 25).");
}
setVar(0, radius);
}
/**
* Apply the filter to the input and save to the specified
* allocation.
*
* @param aout Output allocation. Must match creation element
* type.
*/
public void forEach(Allocation aout) {
forEach(0, null, aout, null);
}
/**
* Get a KernelID for this intrinsic kernel.
*
* @return Script.KernelID The KernelID object.
*/
public Script.KernelID getKernelID() {
return createKernelID(0, 2, null, null);
}
/**
* Get a FieldID for the input field of this intrinsic.
*
* @return Script.FieldID The FieldID object.
*/
public Script.FieldID getFieldID_Input() {
return createFieldID(1, null);
}
}

View File

@@ -0,0 +1,263 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.renderscript;
/**
* Intrinsic for applying a color matrix to allocations.
*
* If the element type is {@link Element.DataType#UNSIGNED_8},
* it is converted to {@link Element.DataType#FLOAT_32} and
* normalized from (0-255) to (0-1). If the incoming vector size
* is less than four, a {@link Element#F32_4} is created by
* filling the missing vector channels with zero. This value is
* then multiplied by the 4x4 color matrix as performed by
* rsMatrixMultiply(), adding a {@link Element#F32_4}, and then
* writing it to the output {@link Allocation}.
*
* If the ouptut type is unsigned, the value is normalized from
* (0-1) to (0-255) and converted. If the output vector size is
* less than four, the unused channels are discarded.
*
* Supported elements types are {@link Element#U8}, {@link
* Element#U8_2}, {@link Element#U8_3}, {@link Element#U8_4},
* {@link Element#F32}, {@link Element#F32_2}, {@link
* Element#F32_3}, and {@link Element#F32_4}.
**/
public final class ScriptIntrinsicColorMatrix extends ScriptIntrinsic {
private final Matrix4f mMatrix = new Matrix4f();
private final Float4 mAdd = new Float4();
private ScriptIntrinsicColorMatrix(long id, RenderScript rs) {
super(id, rs);
}
/**
* Create an intrinsic for applying a color matrix to an
* allocation.
*
* @param rs The RenderScript context
* @param e Element type for inputs and outputs, As of API 19,
* this parameter is ignored. The Element type check is
* performed in the kernel launch.
*
* @deprecated Use the single argument version as Element is now
* ignored.
*
* @return ScriptIntrinsicColorMatrix
*/
@Deprecated
public static ScriptIntrinsicColorMatrix create(RenderScript rs, Element e) {
return create(rs);
}
/**
* Create an intrinsic for applying a color matrix to an
* allocation.
*
* @param rs The RenderScript context
*
* @return ScriptIntrinsicColorMatrix
*/
public static ScriptIntrinsicColorMatrix create(RenderScript rs) {
long id = rs.nScriptIntrinsicCreate(2, 0);
return new ScriptIntrinsicColorMatrix(id, rs);
}
private void setMatrix() {
FieldPacker fp = new FieldPacker(16*4);
fp.addMatrix(mMatrix);
setVar(0, fp);
}
/**
* Set the color matrix which will be applied to each cell of
* the image.
*
* @param m The 4x4 matrix to set.
*/
public void setColorMatrix(Matrix4f m) {
mMatrix.load(m);
setMatrix();
}
/**
* Set the color matrix which will be applied to each cell of the image.
* This will set the alpha channel to be a copy.
*
* @param m The 3x3 matrix to set.
*/
public void setColorMatrix(Matrix3f m) {
mMatrix.load(m);
setMatrix();
}
/**
* Set the value to be added after the color matrix has been
* applied. The default value is {0, 0, 0, 0}
*
* @param f The float4 value to be added.
*/
public void setAdd(Float4 f) {
mAdd.x = f.x;
mAdd.y = f.y;
mAdd.z = f.z;
mAdd.w = f.w;
FieldPacker fp = new FieldPacker(4*4);
fp.addF32(f.x);
fp.addF32(f.y);
fp.addF32(f.z);
fp.addF32(f.w);
setVar(1, fp);
}
/**
* Set the value to be added after the color matrix has been
* applied. The default value is {0, 0, 0, 0}
*
* @param r The red add value.
* @param g The green add value.
* @param b The blue add value.
* @param a The alpha add value.
*/
public void setAdd(float r, float g, float b, float a) {
mAdd.x = r;
mAdd.y = g;
mAdd.z = b;
mAdd.w = a;
FieldPacker fp = new FieldPacker(4*4);
fp.addF32(mAdd.x);
fp.addF32(mAdd.y);
fp.addF32(mAdd.z);
fp.addF32(mAdd.w);
setVar(1, fp);
}
/**
* Set a color matrix to convert from RGB to luminance. The alpha channel
* will be a copy.
*
*/
public void setGreyscale() {
mMatrix.loadIdentity();
mMatrix.set(0, 0, 0.299f);
mMatrix.set(1, 0, 0.587f);
mMatrix.set(2, 0, 0.114f);
mMatrix.set(0, 1, 0.299f);
mMatrix.set(1, 1, 0.587f);
mMatrix.set(2, 1, 0.114f);
mMatrix.set(0, 2, 0.299f);
mMatrix.set(1, 2, 0.587f);
mMatrix.set(2, 2, 0.114f);
setMatrix();
}
/**
* Set the matrix to convert from YUV to RGB with a direct copy of the 4th
* channel.
*
*/
public void setYUVtoRGB() {
mMatrix.loadIdentity();
mMatrix.set(0, 0, 1.f);
mMatrix.set(1, 0, 0.f);
mMatrix.set(2, 0, 1.13983f);
mMatrix.set(0, 1, 1.f);
mMatrix.set(1, 1, -0.39465f);
mMatrix.set(2, 1, -0.5806f);
mMatrix.set(0, 2, 1.f);
mMatrix.set(1, 2, 2.03211f);
mMatrix.set(2, 2, 0.f);
setMatrix();
}
/**
* Set the matrix to convert from RGB to YUV with a direct copy of the 4th
* channel.
*
*/
public void setRGBtoYUV() {
mMatrix.loadIdentity();
mMatrix.set(0, 0, 0.299f);
mMatrix.set(1, 0, 0.587f);
mMatrix.set(2, 0, 0.114f);
mMatrix.set(0, 1, -0.14713f);
mMatrix.set(1, 1, -0.28886f);
mMatrix.set(2, 1, 0.436f);
mMatrix.set(0, 2, 0.615f);
mMatrix.set(1, 2, -0.51499f);
mMatrix.set(2, 2, -0.10001f);
setMatrix();
}
/**
* Invoke the kernel and apply the matrix to each cell of input
* {@link Allocation} and copy to the output {@link Allocation}.
*
* If the vector size of the input is less than four, the
* remaining components are treated as zero for the matrix
* multiply.
*
* If the output vector size is less than four, the unused
* vector components are discarded.
*
*
* @param ain Input allocation
* @param aout Output allocation
*/
public void forEach(Allocation ain, Allocation aout) {
if (!ain.getElement().isCompatible(Element.U8(mRS)) &&
!ain.getElement().isCompatible(Element.U8_2(mRS)) &&
!ain.getElement().isCompatible(Element.U8_3(mRS)) &&
!ain.getElement().isCompatible(Element.U8_4(mRS)) &&
!ain.getElement().isCompatible(Element.F32(mRS)) &&
!ain.getElement().isCompatible(Element.F32_2(mRS)) &&
!ain.getElement().isCompatible(Element.F32_3(mRS)) &&
!ain.getElement().isCompatible(Element.F32_4(mRS))) {
throw new RSIllegalArgumentException("Unsuported element type.");
}
if (!aout.getElement().isCompatible(Element.U8(mRS)) &&
!aout.getElement().isCompatible(Element.U8_2(mRS)) &&
!aout.getElement().isCompatible(Element.U8_3(mRS)) &&
!aout.getElement().isCompatible(Element.U8_4(mRS)) &&
!aout.getElement().isCompatible(Element.F32(mRS)) &&
!aout.getElement().isCompatible(Element.F32_2(mRS)) &&
!aout.getElement().isCompatible(Element.F32_3(mRS)) &&
!aout.getElement().isCompatible(Element.F32_4(mRS))) {
throw new RSIllegalArgumentException("Unsuported element type.");
}
forEach(0, ain, aout, null);
}
/**
* Get a KernelID for this intrinsic kernel.
*
* @return Script.KernelID The KernelID object.
*/
public Script.KernelID getKernelID() {
return createKernelID(0, 3, null, null);
}
}

View File

@@ -0,0 +1,131 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.renderscript;
/**
* Intrinsic for applying a 3x3 convolve to an allocation.
*
**/
public final class ScriptIntrinsicConvolve3x3 extends ScriptIntrinsic {
private final float[] mValues = new float[9];
private Allocation mInput;
private ScriptIntrinsicConvolve3x3(long id, RenderScript rs) {
super(id, rs);
}
/**
* Supported elements types are {@link Element#U8}, {@link
* Element#U8_2}, {@link Element#U8_3}, {@link Element#U8_4},
* {@link Element#F32}, {@link Element#F32_2}, {@link
* Element#F32_3}, and {@link Element#F32_4}
*
* The default coefficients are.
*
* <code>
* <p> [ 0, 0, 0 ]
* <p> [ 0, 1, 0 ]
* <p> [ 0, 0, 0 ]
* </code>
*
* @param rs The RenderScript context
* @param e Element type for intputs and outputs
*
* @return ScriptIntrinsicConvolve3x3
*/
public static ScriptIntrinsicConvolve3x3 create(RenderScript rs, Element e) {
float f[] = { 0, 0, 0, 0, 1, 0, 0, 0, 0};
if (!e.isCompatible(Element.U8(rs)) &&
!e.isCompatible(Element.U8_2(rs)) &&
!e.isCompatible(Element.U8_3(rs)) &&
!e.isCompatible(Element.U8_4(rs)) &&
!e.isCompatible(Element.F32(rs)) &&
!e.isCompatible(Element.F32_2(rs)) &&
!e.isCompatible(Element.F32_3(rs)) &&
!e.isCompatible(Element.F32_4(rs))) {
throw new RSIllegalArgumentException("Unsuported element type.");
}
long id = rs.nScriptIntrinsicCreate(1, e.getID(rs));
ScriptIntrinsicConvolve3x3 si = new ScriptIntrinsicConvolve3x3(id, rs);
si.setCoefficients(f);
return si;
}
/**
* Set the input of the blur.
* Must match the element type supplied during create.
*
* @param ain The input allocation.
*/
public void setInput(Allocation ain) {
mInput = ain;
setVar(1, ain);
}
/**
* Set the coefficients for the convolve.
*
* The convolve layout is
* <code>
* <p> [ 0, 1, 2 ]
* <p> [ 3, 4, 5 ]
* <p> [ 6, 7, 8 ]
* </code>
*
* @param v The array of coefficients to set
*/
public void setCoefficients(float v[]) {
FieldPacker fp = new FieldPacker(9*4);
for (int ct=0; ct < mValues.length; ct++) {
mValues[ct] = v[ct];
fp.addF32(mValues[ct]);
}
setVar(0, fp);
}
/**
* Apply the filter to the input and save to the specified
* allocation.
*
* @param aout Output allocation. Must match creation element
* type.
*/
public void forEach(Allocation aout) {
forEach(0, null, aout, null);
}
/**
* Get a KernelID for this intrinsic kernel.
*
* @return Script.KernelID The KernelID object.
*/
public Script.KernelID getKernelID() {
return createKernelID(0, 2, null, null);
}
/**
* Get a FieldID for the input field of this intrinsic.
*
* @return Script.FieldID The FieldID object.
*/
public Script.FieldID getFieldID_Input() {
return createFieldID(1, null);
}
}

View File

@@ -0,0 +1,131 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.renderscript;
/**
* Intrinsic for applying a 5x5 convolve to an allocation.
*
**/
public final class ScriptIntrinsicConvolve5x5 extends ScriptIntrinsic {
private final float[] mValues = new float[25];
private Allocation mInput;
private ScriptIntrinsicConvolve5x5(long id, RenderScript rs) {
super(id, rs);
}
/**
* Supported elements types are {@link Element#U8}, {@link
* Element#U8_2}, {@link Element#U8_3}, {@link Element#U8_4},
* {@link Element#F32}, {@link Element#F32_2}, {@link
* Element#F32_3}, and {@link Element#F32_4}
*
* The default coefficients are.
* <code>
* <p> [ 0, 0, 0, 0, 0 ]
* <p> [ 0, 0, 0, 0, 0 ]
* <p> [ 0, 0, 1, 0, 0 ]
* <p> [ 0, 0, 0, 0, 0 ]
* <p> [ 0, 0, 0, 0, 0 ]
* </code>
*
* @param rs The RenderScript context
* @param e Element type for intputs and outputs
*
* @return ScriptIntrinsicConvolve5x5
*/
public static ScriptIntrinsicConvolve5x5 create(RenderScript rs, Element e) {
if (!e.isCompatible(Element.U8(rs)) &&
!e.isCompatible(Element.U8_2(rs)) &&
!e.isCompatible(Element.U8_3(rs)) &&
!e.isCompatible(Element.U8_4(rs)) &&
!e.isCompatible(Element.F32(rs)) &&
!e.isCompatible(Element.F32_2(rs)) &&
!e.isCompatible(Element.F32_3(rs)) &&
!e.isCompatible(Element.F32_4(rs))) {
throw new RSIllegalArgumentException("Unsuported element type.");
}
long id = rs.nScriptIntrinsicCreate(4, e.getID(rs));
return new ScriptIntrinsicConvolve5x5(id, rs);
}
/**
* Set the input of the blur.
* Must match the element type supplied during create.
*
* @param ain The input allocation.
*/
public void setInput(Allocation ain) {
mInput = ain;
setVar(1, ain);
}
/**
* Set the coefficients for the convolve.
*
* The convolve layout is
* <code>
* <p> [ 0, 1, 2, 3, 4 ]
* <p> [ 5, 6, 7, 8, 9 ]
* <p> [ 10, 11, 12, 13, 14 ]
* <p> [ 15, 16, 17, 18, 19 ]
* <p> [ 20, 21, 22, 23, 24 ]
* </code>
*
* @param v The array of coefficients to set
*/
public void setCoefficients(float v[]) {
FieldPacker fp = new FieldPacker(25*4);
for (int ct=0; ct < mValues.length; ct++) {
mValues[ct] = v[ct];
fp.addF32(mValues[ct]);
}
setVar(0, fp);
}
/**
* Apply the filter to the input and save to the specified
* allocation.
*
* @param aout Output allocation. Must match creation element
* type.
*/
public void forEach(Allocation aout) {
forEach(0, null, aout, null);
}
/**
* Get a KernelID for this intrinsic kernel.
*
* @return Script.KernelID The KernelID object.
*/
public Script.KernelID getKernelID() {
return createKernelID(0, 2, null, null);
}
/**
* Get a FieldID for the input field of this intrinsic.
*
* @return Script.FieldID The FieldID object.
*/
public Script.FieldID getFieldID_Input() {
return createFieldID(1, null);
}
}

View File

@@ -0,0 +1,182 @@
/*
* Copyright (C) 2013 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.renderscript;
/**
* Intrinsic Histogram filter.
*
*
**/
public final class ScriptIntrinsicHistogram extends ScriptIntrinsic {
private Allocation mOut;
private ScriptIntrinsicHistogram(long id, RenderScript rs) {
super(id, rs);
}
/**
* Create an intrinsic for calculating the histogram of an uchar
* or uchar4 image.
*
* Supported elements types are
* {@link Element#U8_4}, {@link Element#U8_3},
* {@link Element#U8_2}, {@link Element#U8}
*
* @param rs The RenderScript context
* @param e Element type for inputs
*
* @return ScriptIntrinsicHistogram
*/
public static ScriptIntrinsicHistogram create(RenderScript rs, Element e) {
if ((!e.isCompatible(Element.U8_4(rs))) &&
(!e.isCompatible(Element.U8_3(rs))) &&
(!e.isCompatible(Element.U8_2(rs))) &&
(!e.isCompatible(Element.U8(rs)))) {
throw new RSIllegalArgumentException("Unsuported element type.");
}
long id = rs.nScriptIntrinsicCreate(9, e.getID(rs));
ScriptIntrinsicHistogram sib = new ScriptIntrinsicHistogram(id, rs);
return sib;
}
/**
* Process an input buffer and place the histogram into the
* output allocation. The output allocation may be a narrower
* vector size than the input. In this case the vector size of
* the output is used to determine how many of the input
* channels are used in the computation. This is useful if you
* have an RGBA input buffer but only want the histogram for
* RGB.
*
* 1D and 2D input allocations are supported.
*
* @param ain The input image
*/
public void forEach(Allocation ain) {
if (ain.getType().getElement().getVectorSize() <
mOut.getType().getElement().getVectorSize()) {
throw new RSIllegalArgumentException(
"Input vector size must be >= output vector size.");
}
if (ain.getType().getElement().isCompatible(Element.U8(mRS)) &&
ain.getType().getElement().isCompatible(Element.U8_4(mRS))) {
throw new RSIllegalArgumentException("Output type must be U32 or I32.");
}
forEach(0, ain, null, null);
}
/**
* Set the coefficients used for the RGBA to Luminocity
* calculation. The default is {0.299f, 0.587f, 0.114f, 0.f}.
*
* Coefficients must be >= 0 and sum to 1.0 or less.
*
* @param r Red coefficient
* @param g Green coefficient
* @param b Blue coefficient
* @param a Alpha coefficient
*/
public void setDotCoefficients(float r, float g, float b, float a) {
if ((r < 0.f) || (g < 0.f) || (b < 0.f) || (a < 0.f)) {
throw new RSIllegalArgumentException("Coefficient may not be negative.");
}
if ((r + g + b + a) > 1.f) {
throw new RSIllegalArgumentException("Sum of coefficients must be 1.0 or less.");
}
FieldPacker fp = new FieldPacker(16);
fp.addF32(r);
fp.addF32(g);
fp.addF32(b);
fp.addF32(a);
setVar(0, fp);
}
/**
* Set the output of the histogram. 32 bit integer types are
* supported.
*
* @param aout The output allocation
*/
public void setOutput(Allocation aout) {
mOut = aout;
if (mOut.getType().getElement() != Element.U32(mRS) &&
mOut.getType().getElement() != Element.U32_2(mRS) &&
mOut.getType().getElement() != Element.U32_3(mRS) &&
mOut.getType().getElement() != Element.U32_4(mRS) &&
mOut.getType().getElement() != Element.I32(mRS) &&
mOut.getType().getElement() != Element.I32_2(mRS) &&
mOut.getType().getElement() != Element.I32_3(mRS) &&
mOut.getType().getElement() != Element.I32_4(mRS)) {
throw new RSIllegalArgumentException("Output type must be U32 or I32.");
}
if ((mOut.getType().getX() != 256) ||
(mOut.getType().getY() != 0) ||
mOut.getType().hasMipmaps() ||
(mOut.getType().getYuv() != 0)) {
throw new RSIllegalArgumentException("Output must be 1D, 256 elements.");
}
setVar(1, aout);
}
/**
* Process an input buffer and place the histogram into the
* output allocation. The dot product of the input channel and
* the coefficients from 'setDotCoefficients' are used to
* calculate the output values.
*
* 1D and 2D input allocations are supported.
*
* @param ain The input image
*/
public void forEach_Dot(Allocation ain) {
if (mOut.getType().getElement().getVectorSize() != 1) {
throw new RSIllegalArgumentException("Output vector size must be one.");
}
if (ain.getType().getElement().isCompatible(Element.U8(mRS)) &&
ain.getType().getElement().isCompatible(Element.U8_4(mRS))) {
throw new RSIllegalArgumentException("Output type must be U32 or I32.");
}
forEach(1, ain, null, null);
}
/**
* Get a KernelID for this intrinsic kernel.
*
* @return Script.KernelID The KernelID object.
*/
public Script.KernelID getKernelID_Separate() {
return createKernelID(0, 3, null, null);
}
/**
* Get a FieldID for the input field of this intrinsic.
*
* @return Script.FieldID The FieldID object.
*/
public Script.FieldID getFieldID_Input() {
return createFieldID(1, null);
}
}

View File

@@ -0,0 +1,142 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.renderscript;
/**
* Intrinsic for applying a per-channel lookup table. Each
* channel of the input has an independant lookup table. The
* tables are 256 entries in size and can cover the full value
* range of {@link Element#U8_4}.
**/
public final class ScriptIntrinsicLUT extends ScriptIntrinsic {
private final Matrix4f mMatrix = new Matrix4f();
private Allocation mTables;
private final byte mCache[] = new byte[1024];
private boolean mDirty = true;
private ScriptIntrinsicLUT(long id, RenderScript rs) {
super(id, rs);
mTables = Allocation.createSized(rs, Element.U8(rs), 1024);
for (int ct=0; ct < 256; ct++) {
mCache[ct] = (byte)ct;
mCache[ct + 256] = (byte)ct;
mCache[ct + 512] = (byte)ct;
mCache[ct + 768] = (byte)ct;
}
setVar(0, mTables);
}
/**
* Supported elements types are {@link Element#U8_4}
*
* The defaults tables are identity.
*
* @param rs The RenderScript context
* @param e Element type for intputs and outputs
*
* @return ScriptIntrinsicLUT
*/
public static ScriptIntrinsicLUT create(RenderScript rs, Element e) {
long id = rs.nScriptIntrinsicCreate(3, e.getID(rs));
return new ScriptIntrinsicLUT(id, rs);
}
private void validate(int index, int value) {
if (index < 0 || index > 255) {
throw new RSIllegalArgumentException("Index out of range (0-255).");
}
if (value < 0 || value > 255) {
throw new RSIllegalArgumentException("Value out of range (0-255).");
}
}
/**
* Set an entry in the red channel lookup table
*
* @param index Must be 0-255
* @param value Must be 0-255
*/
public void setRed(int index, int value) {
validate(index, value);
mCache[index] = (byte)value;
mDirty = true;
}
/**
* Set an entry in the green channel lookup table
*
* @param index Must be 0-255
* @param value Must be 0-255
*/
public void setGreen(int index, int value) {
validate(index, value);
mCache[index+256] = (byte)value;
mDirty = true;
}
/**
* Set an entry in the blue channel lookup table
*
* @param index Must be 0-255
* @param value Must be 0-255
*/
public void setBlue(int index, int value) {
validate(index, value);
mCache[index+512] = (byte)value;
mDirty = true;
}
/**
* Set an entry in the alpha channel lookup table
*
* @param index Must be 0-255
* @param value Must be 0-255
*/
public void setAlpha(int index, int value) {
validate(index, value);
mCache[index+768] = (byte)value;
mDirty = true;
}
/**
* Invoke the kernel and apply the lookup to each cell of ain
* and copy to aout.
*
* @param ain Input allocation
* @param aout Output allocation
*/
public void forEach(Allocation ain, Allocation aout) {
if (mDirty) {
mDirty = false;
mTables.copyFromUnchecked(mCache);
}
forEach(0, ain, aout, null);
}
/**
* Get a KernelID for this intrinsic kernel.
*
* @return Script.KernelID The KernelID object.
*/
public Script.KernelID getKernelID() {
return createKernelID(0, 3, null, null);
}
}

View File

@@ -0,0 +1,89 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.renderscript;
/**
* Intrinsic for converting an Android YUV buffer to RGB.
*
* The input allocation should be supplied in a supported YUV format
* as a YUV element Allocation. The output is RGBA; the alpha channel
* will be set to 255.
*/
public final class ScriptIntrinsicYuvToRGB extends ScriptIntrinsic {
private Allocation mInput;
ScriptIntrinsicYuvToRGB(long id, RenderScript rs) {
super(id, rs);
}
/**
* Create an intrinsic for converting YUV to RGB.
*
* Supported elements types are {@link Element#U8_4}
*
* @param rs The RenderScript context
* @param e Element type for output
*
* @return ScriptIntrinsicYuvToRGB
*/
public static ScriptIntrinsicYuvToRGB create(RenderScript rs, Element e) {
// 6 comes from RS_SCRIPT_INTRINSIC_YUV_TO_RGB in rsDefines.h
long id = rs.nScriptIntrinsicCreate(6, e.getID(rs));
ScriptIntrinsicYuvToRGB si = new ScriptIntrinsicYuvToRGB(id, rs);
return si;
}
/**
* Set the input yuv allocation, must be {@link Element#U8}.
*
* @param ain The input allocation.
*/
public void setInput(Allocation ain) {
mInput = ain;
setVar(0, ain);
}
/**
* Convert the image to RGB.
*
* @param aout Output allocation. Must match creation element
* type.
*/
public void forEach(Allocation aout) {
forEach(0, null, aout, null);
}
/**
* Get a KernelID for this intrinsic kernel.
*
* @return Script.KernelID The KernelID object.
*/
public Script.KernelID getKernelID() {
return createKernelID(0, 2, null, null);
}
/**
* Get a FieldID for the input field of this intrinsic.
*
* @return Script.FieldID The FieldID object.
*/
public Script.FieldID getFieldID_Input() {
return createFieldID(0, null);
}
}

View File

@@ -0,0 +1,443 @@
/*
* Copyright (C) 2013 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.renderscript;
/**
* Class for exposing the native RenderScript Short2 type back to the Android system.
*
* Vector version of the basic short type.
* Provides two short fields packed.
*/
public class Short2 {
public short x;
public short y;
public Short2() {
}
/** @hide */
public Short2(short i) {
this.x = this.y = i;
}
public Short2(short x, short y) {
this.x = x;
this.y = y;
}
/** @hide */
public Short2(Short2 source) {
this.x = source.x;
this.y = source.y;
}
/** @hide
* Vector add
*
* @param a
*/
public void add(Short2 a) {
this.x += a.x;
this.y += a.y;
}
/** @hide
* Vector add
*
* @param a
* @param b
* @return
*/
public static Short2 add(Short2 a, Short2 b) {
Short2 result = new Short2();
result.x = (short)(a.x + b.x);
result.y = (short)(a.y + b.y);
return result;
}
/** @hide
* Vector add
*
* @param value
*/
public void add(short value) {
x += value;
y += value;
}
/** @hide
* Vector add
*
* @param a
* @param b
* @return
*/
public static Short2 add(Short2 a, short b) {
Short2 result = new Short2();
result.x = (short)(a.x + b);
result.y = (short)(a.y + b);
return result;
}
/** @hide
* Vector subtraction
*
* @param a
*/
public void sub(Short2 a) {
this.x -= a.x;
this.y -= a.y;
}
/** @hide
* Vector subtraction
*
* @param a
* @param b
* @return
*/
public static Short2 sub(Short2 a, Short2 b) {
Short2 result = new Short2();
result.x = (short)(a.x - b.x);
result.y = (short)(a.y - b.y);
return result;
}
/** @hide
* Vector subtraction
*
* @param value
*/
public void sub(short value) {
x -= value;
y -= value;
}
/** @hide
* Vector subtraction
*
* @param a
* @param b
* @return
*/
public static Short2 sub(Short2 a, short b) {
Short2 result = new Short2();
result.x = (short)(a.x - b);
result.y = (short)(a.y - b);
return result;
}
/** @hide
* Vector multiplication
*
* @param a
*/
public void mul(Short2 a) {
this.x *= a.x;
this.y *= a.y;
}
/** @hide
* Vector multiplication
*
* @param a
* @param b
* @return
*/
public static Short2 mul(Short2 a, Short2 b) {
Short2 result = new Short2();
result.x = (short)(a.x * b.x);
result.y = (short)(a.y * b.y);
return result;
}
/** @hide
* Vector multiplication
*
* @param value
*/
public void mul(short value) {
x *= value;
y *= value;
}
/** @hide
* Vector multiplication
*
* @param a
* @param b
* @return
*/
public static Short2 mul(Short2 a, short b) {
Short2 result = new Short2();
result.x = (short)(a.x * b);
result.y = (short)(a.y * b);
return result;
}
/** @hide
* Vector division
*
* @param a
*/
public void div(Short2 a) {
this.x /= a.x;
this.y /= a.y;
}
/** @hide
* Vector division
*
* @param a
* @param b
* @return
*/
public static Short2 div(Short2 a, Short2 b) {
Short2 result = new Short2();
result.x = (short)(a.x / b.x);
result.y = (short)(a.y / b.y);
return result;
}
/** @hide
* Vector division
*
* @param value
*/
public void div(short value) {
x /= value;
y /= value;
}
/** @hide
* Vector division
*
* @param a
* @param b
* @return
*/
public static Short2 div(Short2 a, short b) {
Short2 result = new Short2();
result.x = (short)(a.x / b);
result.y = (short)(a.y / b);
return result;
}
/** @hide
* Vector Modulo
*
* @param a
*/
public void mod(Short2 a) {
this.x %= a.x;
this.y %= a.y;
}
/** @hide
* Vector Modulo
*
* @param a
* @param b
* @return
*/
public static Short2 mod(Short2 a, Short2 b) {
Short2 result = new Short2();
result.x = (short)(a.x % b.x);
result.y = (short)(a.y % b.y);
return result;
}
/** @hide
* Vector Modulo
*
* @param value
*/
public void mod(short value) {
x %= value;
y %= value;
}
/** @hide
* Vector Modulo
*
* @param a
* @param b
* @return
*/
public static Short2 mod(Short2 a, short b) {
Short2 result = new Short2();
result.x = (short)(a.x % b);
result.y = (short)(a.y % b);
return result;
}
/** @hide
* get vector length
*
* @return
*/
public short length() {
return 2;
}
/** @hide
* set vector negate
*/
public void negate() {
this.x = (short)(-x);
this.y = (short)(-y);
}
/** @hide
* Vector dot Product
*
* @param a
* @return
*/
public short dotProduct(Short2 a) {
return (short)((x * a.x) + (y * a.y));
}
/** @hide
* Vector dot Product
*
* @param a
* @param b
* @return
*/
public static short dotProduct(Short2 a, Short2 b) {
return (short)((b.x * a.x) + (b.y * a.y));
}
/** @hide
* Vector add Multiple
*
* @param a
* @param factor
*/
public void addMultiple(Short2 a, short factor) {
x += a.x * factor;
y += a.y * factor;
}
/** @hide
* set vector value by Short2
*
* @param a
*/
public void set(Short2 a) {
this.x = a.x;
this.y = a.y;
}
/** @hide
* set the vector field value by Short
*
* @param a
* @param b
*/
public void setValues(short a, short b) {
this.x = a;
this.y = b;
}
/** @hide
* return the element sum of vector
*
* @return
*/
public short elementSum() {
return (short)(x + y);
}
/** @hide
* get the vector field value by index
*
* @param i
* @return
*/
public short get(int i) {
switch (i) {
case 0:
return (short)(x);
case 1:
return (short)(y);
default:
throw new IndexOutOfBoundsException("Index: i");
}
}
/** @hide
* set the vector field value by index
*
* @param i
* @param value
*/
public void setAt(int i, short value) {
switch (i) {
case 0:
x = value;
return;
case 1:
y = value;
return;
default:
throw new IndexOutOfBoundsException("Index: i");
}
}
/** @hide
* add the vector field value by index
*
* @param i
* @param value
*/
public void addAt(int i, short value) {
switch (i) {
case 0:
x += value;
return;
case 1:
y += value;
return;
default:
throw new IndexOutOfBoundsException("Index: i");
}
}
/** @hide
* copy the vector to short array
*
* @param data
* @param offset
*/
public void copyTo(short[] data, int offset) {
data[offset] = (short)(x);
data[offset + 1] = (short)(y);
}
}

View File

@@ -0,0 +1,477 @@
/*
* Copyright (C) 2013 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.renderscript;
/**
* Vector version of the basic short type.
* Provides three short fields packed.
*/
public class Short3 {
public short x;
public short y;
public short z;
public Short3() {
}
/** @hide */
public Short3(short i) {
this.x = this.y = this.z = i;
}
public Short3(short x, short y, short z) {
this.x = x;
this.y = y;
this.z = z;
}
/** @hide */
public Short3(Short3 source) {
this.x = source.x;
this.y = source.y;
this.z = source.z;
}
/** @hide
* Vector add
*
* @param a
*/
public void add(Short3 a) {
this.x += a.x;
this.y += a.y;
this.z += a.z;
}
/** @hide
* Vector add
*
* @param a
* @param b
* @return
*/
public static Short3 add(Short3 a, Short3 b) {
Short3 result = new Short3();
result.x = (short)(a.x + b.x);
result.y = (short)(a.y + b.y);
result.z = (short)(a.z + b.z);
return result;
}
/** @hide
* Vector add
*
* @param value
*/
public void add(short value) {
x += value;
y += value;
z += value;
}
/** @hide
* Vector add
*
* @param a
* @param b
* @return
*/
public static Short3 add(Short3 a, short b) {
Short3 result = new Short3();
result.x = (short)(a.x + b);
result.y = (short)(a.y + b);
result.z = (short)(a.z + b);
return result;
}
/** @hide
* Vector subtraction
*
* @param a
*/
public void sub(Short3 a) {
this.x -= a.x;
this.y -= a.y;
this.z -= a.z;
}
/** @hide
* Vector subtraction
*
* @param a
* @param b
* @return
*/
public static Short3 sub(Short3 a, Short3 b) {
Short3 result = new Short3();
result.x = (short)(a.x - b.x);
result.y = (short)(a.y - b.y);
result.z = (short)(a.z - b.z);
return result;
}
/** @hide
* Vector subtraction
*
* @param value
*/
public void sub(short value) {
x -= value;
y -= value;
z -= value;
}
/** @hide
* Vector subtraction
*
* @param a
* @param b
* @return
*/
public static Short3 sub(Short3 a, short b) {
Short3 result = new Short3();
result.x = (short)(a.x - b);
result.y = (short)(a.y - b);
result.z = (short)(a.z - b);
return result;
}
/** @hide
* Vector multiplication
*
* @param a
*/
public void mul(Short3 a) {
this.x *= a.x;
this.y *= a.y;
this.z *= a.z;
}
/** @hide
* Vector multiplication
*
* @param a
* @param b
* @return
*/
public static Short3 mul(Short3 a, Short3 b) {
Short3 result = new Short3();
result.x = (short)(a.x * b.x);
result.y = (short)(a.y * b.y);
result.z = (short)(a.z * b.z);
return result;
}
/** @hide
* Vector multiplication
*
* @param value
*/
public void mul(short value) {
x *= value;
y *= value;
z *= value;
}
/** @hide
* Vector multiplication
*
* @param a
* @param b
* @return
*/
public static Short3 mul(Short3 a, short b) {
Short3 result = new Short3();
result.x = (short)(a.x * b);
result.y = (short)(a.y * b);
result.z = (short)(a.z * b);
return result;
}
/** @hide
* Vector division
*
* @param a
*/
public void div(Short3 a) {
this.x /= a.x;
this.y /= a.y;
this.z /= a.z;
}
/** @hide
* Vector division
*
* @param a
* @param b
* @return
*/
public static Short3 div(Short3 a, Short3 b) {
Short3 result = new Short3();
result.x = (short)(a.x / b.x);
result.y = (short)(a.y / b.y);
result.z = (short)(a.z / b.z);
return result;
}
/** @hide
* Vector division
*
* @param value
*/
public void div(short value) {
x /= value;
y /= value;
z /= value;
}
/** @hide
* Vector division
*
* @param a
* @param b
* @return
*/
public static Short3 div(Short3 a, short b) {
Short3 result = new Short3();
result.x = (short)(a.x / b);
result.y = (short)(a.y / b);
result.z = (short)(a.z / b);
return result;
}
/** @hide
* Vector Modulo
*
* @param a
*/
public void mod(Short3 a) {
this.x %= a.x;
this.y %= a.y;
this.z %= a.z;
}
/** @hide
* Vector Modulo
*
* @param a
* @param b
* @return
*/
public static Short3 mod(Short3 a, Short3 b) {
Short3 result = new Short3();
result.x = (short)(a.x % b.x);
result.y = (short)(a.y % b.y);
result.z = (short)(a.z % b.z);
return result;
}
/** @hide
* Vector Modulo
*
* @param value
*/
public void mod(short value) {
x %= value;
y %= value;
z %= value;
}
/** @hide
* Vector Modulo
*
* @param a
* @param b
* @return
*/
public static Short3 mod(Short3 a, short b) {
Short3 result = new Short3();
result.x = (short)(a.x % b);
result.y = (short)(a.y % b);
result.z = (short)(a.z % b);
return result;
}
/** @hide
* get vector length
*
* @return
*/
public short length() {
return 3;
}
/** @hide
* set vector negate
*/
public void negate() {
this.x = (short)(-x);
this.y = (short)(-y);
this.z = (short)(-z);
}
/** @hide
* Vector dot Product
*
* @param a
* @return
*/
public short dotProduct(Short3 a) {
return (short)((x * a.x) + (y * a.y) + (z * a.z));
}
/** @hide
* Vector dot Product
*
* @param a
* @param b
* @return
*/
public static short dotProduct(Short3 a, Short3 b) {
return (short)((b.x * a.x) + (b.y * a.y) + (b.z * a.z));
}
/** @hide
* Vector add Multiple
*
* @param a
* @param factor
*/
public void addMultiple(Short3 a, short factor) {
x += a.x * factor;
y += a.y * factor;
z += a.z * factor;
}
/** @hide
* set vector value by Short3
*
* @param a
*/
public void set(Short3 a) {
this.x = a.x;
this.y = a.y;
this.z = a.z;
}
/** @hide
* set the vector field value by Short
*
* @param a
* @param b
* @param c
*/
public void setValues(short a, short b, short c) {
this.x = a;
this.y = b;
this.z = c;
}
/** @hide
* return the element sum of vector
*
* @return
*/
public short elementSum() {
return (short)(x + y + z);
}
/** @hide
* get the vector field value by index
*
* @param i
* @return
*/
public short get(int i) {
switch (i) {
case 0:
return (short)(x);
case 1:
return (short)(y);
case 2:
return (short)(z);
default:
throw new IndexOutOfBoundsException("Index: i");
}
}
/** @hide
* set the vector field value by index
*
* @param i
* @param value
*/
public void setAt(int i, short value) {
switch (i) {
case 0:
x = value;
return;
case 1:
y = value;
return;
case 2:
z = value;
return;
default:
throw new IndexOutOfBoundsException("Index: i");
}
}
/** @hide
* add the vector field value by index
*
* @param i
* @param value
*/
public void addAt(int i, short value) {
switch (i) {
case 0:
x += value;
return;
case 1:
y += value;
return;
case 2:
z += value;
return;
default:
throw new IndexOutOfBoundsException("Index: i");
}
}
/** @hide
* copy the vector to short array
*
* @param data
* @param offset
*/
public void copyTo(short[] data, int offset) {
data[offset] = (short)(x);
data[offset + 1] = (short)(y);
data[offset + 2] = (short)(z);
}
}

View File

@@ -0,0 +1,514 @@
/*
* Copyright (C) 2013 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.renderscript;
/**
* Vector version of the basic short type.
* Provides four short fields packed.
*/
public class Short4 {
public short x;
public short y;
public short z;
public short w;
public Short4() {
}
/** @hide */
public Short4(short i) {
this.x = this.y = this.z = this.w = i;
}
public Short4(short x, short y, short z, short w) {
this.x = x;
this.y = y;
this.z = z;
this.w = w;
}
/** @hide */
public Short4(Short4 source) {
this.x = source.x;
this.y = source.y;
this.z = source.z;
this.w = source.w;
}
/** @hide
* Vector add
*
* @param a
*/
public void add(Short4 a) {
this.x += a.x;
this.y += a.y;
this.z += a.z;
this.w += a.w;
}
/** @hide
* Vector add
*
* @param a
* @param b
* @return
*/
public static Short4 add(Short4 a, Short4 b) {
Short4 result = new Short4();
result.x = (short)(a.x + b.x);
result.y = (short)(a.y + b.y);
result.z = (short)(a.z + b.z);
result.w = (short)(a.w + b.w);
return result;
}
/** @hide
* Vector add
*
* @param value
*/
public void add(short value) {
x += value;
y += value;
z += value;
w += value;
}
/** @hide
* Vector add
*
* @param a
* @param b
* @return
*/
public static Short4 add(Short4 a, short b) {
Short4 result = new Short4();
result.x = (short)(a.x + b);
result.y = (short)(a.y + b);
result.z = (short)(a.z + b);
result.w = (short)(a.w + b);
return result;
}
/** @hide
* Vector subtraction
*
* @param a
*/
public void sub(Short4 a) {
this.x -= a.x;
this.y -= a.y;
this.z -= a.z;
this.w -= a.w;
}
/** @hide
* Vector subtraction
*
* @param a
* @param b
* @return
*/
public static Short4 sub(Short4 a, Short4 b) {
Short4 result = new Short4();
result.x = (short)(a.x - b.x);
result.y = (short)(a.y - b.y);
result.z = (short)(a.z - b.z);
result.w = (short)(a.w - b.w);
return result;
}
/** @hide
* Vector subtraction
*
* @param value
*/
public void sub(short value) {
x -= value;
y -= value;
z -= value;
w -= value;
}
/** @hide
* Vector subtraction
*
* @param a
* @param b
* @return
*/
public static Short4 sub(Short4 a, short b) {
Short4 result = new Short4();
result.x = (short)(a.x - b);
result.y = (short)(a.y - b);
result.z = (short)(a.z - b);
result.w = (short)(a.w - b);
return result;
}
/** @hide
* Vector multiplication
*
* @param a
*/
public void mul(Short4 a) {
this.x *= a.x;
this.y *= a.y;
this.z *= a.z;
this.w *= a.w;
}
/** @hide
* Vector multiplication
*
* @param a
* @param b
* @return
*/
public static Short4 mul(Short4 a, Short4 b) {
Short4 result = new Short4();
result.x = (short)(a.x * b.x);
result.y = (short)(a.y * b.y);
result.z = (short)(a.z * b.z);
result.w = (short)(a.w * b.w);
return result;
}
/** @hide
* Vector multiplication
*
* @param value
*/
public void mul(short value) {
x *= value;
y *= value;
z *= value;
w *= value;
}
/** @hide
* Vector multiplication
*
* @param a
* @param b
* @return
*/
public static Short4 mul(Short4 a, short b) {
Short4 result = new Short4();
result.x = (short)(a.x * b);
result.y = (short)(a.y * b);
result.z = (short)(a.z * b);
result.w = (short)(a.w * b);
return result;
}
/** @hide
* Vector division
*
* @param a
*/
public void div(Short4 a) {
this.x /= a.x;
this.y /= a.y;
this.z /= a.z;
this.w /= a.w;
}
/** @hide
* Vector division
*
* @param a
* @param b
* @return
*/
public static Short4 div(Short4 a, Short4 b) {
Short4 result = new Short4();
result.x = (short)(a.x / b.x);
result.y = (short)(a.y / b.y);
result.z = (short)(a.z / b.z);
result.w = (short)(a.w / b.w);
return result;
}
/** @hide
* Vector division
*
* @param value
*/
public void div(short value) {
x /= value;
y /= value;
z /= value;
w /= value;
}
/** @hide
* Vector division
*
* @param a
* @param b
* @return
*/
public static Short4 div(Short4 a, short b) {
Short4 result = new Short4();
result.x = (short)(a.x / b);
result.y = (short)(a.y / b);
result.z = (short)(a.z / b);
result.w = (short)(a.w / b);
return result;
}
/** @hide
* Vector Modulo
*
* @param a
*/
public void mod(Short4 a) {
this.x %= a.x;
this.y %= a.y;
this.z %= a.z;
this.w %= a.w;
}
/** @hide
* Vector Modulo
*
* @param a
* @param b
* @return
*/
public static Short4 mod(Short4 a, Short4 b) {
Short4 result = new Short4();
result.x = (short)(a.x % b.x);
result.y = (short)(a.y % b.y);
result.z = (short)(a.z % b.z);
result.w = (short)(a.w % b.w);
return result;
}
/** @hide
* Vector Modulo
*
* @param value
*/
public void mod(short value) {
x %= value;
y %= value;
z %= value;
w %= value;
}
/** @hide
* Vector Modulo
*
* @param a
* @param b
* @return
*/
public static Short4 mod(Short4 a, short b) {
Short4 result = new Short4();
result.x = (short)(a.x % b);
result.y = (short)(a.y % b);
result.z = (short)(a.z % b);
result.w = (short)(a.w % b);
return result;
}
/** @hide
* get vector length
*
* @return
*/
public short length() {
return 4;
}
/** @hide
* set vector negate
*/
public void negate() {
this.x = (short)(-x);
this.y = (short)(-y);
this.z = (short)(-z);
this.w = (short)(-w);
}
/** @hide
* Vector dot Product
*
* @param a
* @return
*/
public short dotProduct(Short4 a) {
return (short)((x * a.x) + (y * a.y) + (z * a.z) + (w * a.w));
}
/** @hide
* Vector dot Product
*
* @param a
* @param b
* @return
*/
public static short dotProduct(Short4 a, Short4 b) {
return (short)((b.x * a.x) + (b.y * a.y) + (b.z * a.z) + (b.w * a.w));
}
/** @hide
* Vector add Multiple
*
* @param a
* @param factor
*/
public void addMultiple(Short4 a, short factor) {
x += a.x * factor;
y += a.y * factor;
z += a.z * factor;
w += a.w * factor;
}
/** @hide
* set vector value by Short4
*
* @param a
*/
public void set(Short4 a) {
this.x = a.x;
this.y = a.y;
this.z = a.z;
this.w = a.w;
}
/** @hide
* set the vector field value by Short
*
* @param a
* @param b
* @param c
* @param d
*/
public void setValues(short a, short b, short c, short d) {
this.x = a;
this.y = b;
this.z = c;
this.w = d;
}
/** @hide
* return the element sum of vector
*
* @return
*/
public short elementSum() {
return (short)(x + y + z + w);
}
/** @hide
* get the vector field value by index
*
* @param i
* @return
*/
public short get(int i) {
switch (i) {
case 0:
return (short)(x);
case 1:
return (short)(y);
case 2:
return (short)(z);
case 3:
return (short)(w);
default:
throw new IndexOutOfBoundsException("Index: i");
}
}
/** @hide
* set the vector field value by index
*
* @param i
* @param value
*/
public void setAt(int i, short value) {
switch (i) {
case 0:
x = value;
return;
case 1:
y = value;
return;
case 2:
z = value;
return;
case 3:
w = value;
return;
default:
throw new IndexOutOfBoundsException("Index: i");
}
}
/** @hide
* add the vector field value by index
*
* @param i
* @param value
*/
public void addAt(int i, short value) {
switch (i) {
case 0:
x += value;
return;
case 1:
y += value;
return;
case 2:
z += value;
return;
case 3:
w += value;
return;
default:
throw new IndexOutOfBoundsException("Index: i");
}
}
/** @hide
* copy the vector to short array
*
* @param data
* @param offset
*/
public void copyTo(short[] data, int offset) {
data[offset] = (short)(x);
data[offset + 1] = (short)(y);
data[offset + 2] = (short)(z);
data[offset + 3] = (short)(w);
}
}

View File

@@ -0,0 +1,426 @@
/*
* Copyright (C) 2013 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.renderscript;
/**
* <p>A Type describes the {@link android.renderscript.Element} and dimensions used for an {@link
* android.renderscript.Allocation} or a parallel operation. Types are created through {@link
* android.renderscript.Type.Builder}.</p>
*
* <p>A Type always includes an {@link android.renderscript.Element} and an X
* dimension. A Type may be multidimensional, up to three dimensions. A nonzero
* value in the Y or Z dimensions indicates that the dimension is present. Note
* that a Type with only a given X dimension and a Type with the same X
* dimension but Y = 1 are not equivalent.</p>
*
* <p>A Type also supports inclusion of level of detail (LOD) or cube map
* faces. LOD and cube map faces are booleans to indicate present or not
* present. </p>
*
* <p>A Type also supports YUV format information to support an
* {@link android.renderscript.Allocation} in a YUV format. The YUV formats
* supported are {@link android.graphics.ImageFormat#YV12},
* {@link android.graphics.ImageFormat#NV21}, and
* {@link android.graphics.ImageFormat#YUV_420_888}</p>
*
* <div class="special reference">
* <h3>Developer Guides</h3>
* <p>For more information about creating an application that uses RenderScript, read the
* <a href="{@docRoot}guide/topics/renderscript/index.html">RenderScript</a> developer guide.</p>
* </div>
**/
public class Type extends BaseObj {
int mDimX;
int mDimY;
int mDimZ;
boolean mDimMipmaps;
boolean mDimFaces;
int mDimYuv;
int mElementCount;
Element mElement;
public enum CubemapFace {
POSITIVE_X (0),
NEGATIVE_X (1),
POSITIVE_Y (2),
NEGATIVE_Y (3),
POSITIVE_Z (4),
NEGATIVE_Z (5),
@Deprecated
POSITVE_X (0),
@Deprecated
POSITVE_Y (2),
@Deprecated
POSITVE_Z (4);
int mID;
CubemapFace(int id) {
mID = id;
}
}
/**
* Return the element associated with this Type.
*
* @return Element
*/
public Element getElement() {
return mElement;
}
/**
* Return the value of the X dimension.
*
* @return int
*/
public int getX() {
return mDimX;
}
/**
* Return the value of the Y dimension or 0 for a 1D allocation.
*
* @return int
*/
public int getY() {
return mDimY;
}
/**
* Return the value of the Z dimension or 0 for a 1D or 2D allocation.
*
* @return int
*/
public int getZ() {
return mDimZ;
}
/**
* Get the YUV format
*
*
* @return int
*/
public int getYuv() {
return mDimYuv;
}
/**
* Return if the Type has a mipmap chain.
*
* @return boolean
*/
public boolean hasMipmaps() {
return mDimMipmaps;
}
/**
* Return if the Type is a cube map.
*
* @return boolean
*/
public boolean hasFaces() {
return mDimFaces;
}
/**
* Return the total number of accessable cells in the Type.
*
* @return int
*/
public int getCount() {
return mElementCount;
}
void calcElementCount() {
boolean hasLod = hasMipmaps();
int x = getX();
int y = getY();
int z = getZ();
int faces = 1;
if (hasFaces()) {
faces = 6;
}
if (x == 0) {
x = 1;
}
if (y == 0) {
y = 1;
}
if (z == 0) {
z = 1;
}
int count = x * y * z * faces;
while (hasLod && ((x > 1) || (y > 1) || (z > 1))) {
if(x > 1) {
x >>= 1;
}
if(y > 1) {
y >>= 1;
}
if(z > 1) {
z >>= 1;
}
count += x * y * z * faces;
}
mElementCount = count;
}
Type(long id, RenderScript rs) {
super(id, rs);
}
@Override
void updateFromNative() {
// FIXME: rsaTypeGetNativeData needs 32-bit and 64-bit paths
// We have 6 integer to obtain mDimX; mDimY; mDimZ;
// mDimLOD; mDimFaces; mElement;
int[] dataBuffer = new int[6];
mRS.nTypeGetNativeData((int)getID(mRS), dataBuffer);
mDimX = dataBuffer[0];
mDimY = dataBuffer[1];
mDimZ = dataBuffer[2];
mDimMipmaps = dataBuffer[3] == 1 ? true : false;
mDimFaces = dataBuffer[4] == 1 ? true : false;
int elementID = dataBuffer[5];
if(elementID != 0) {
mElement = new Element(elementID, mRS);
mElement.updateFromNative();
}
calcElementCount();
}
/**
* Utility function for creating basic 1D types. The type is
* created without mipmaps enabled.
*
* @param rs The RenderScript context
* @param e The Element for the Type
* @param dimX The X dimension, must be > 0
*
* @return Type
*/
static public Type createX(RenderScript rs, Element e, int dimX) {
if (dimX < 1) {
throw new RSInvalidStateException("Dimension must be >= 1.");
}
long id = rs.nTypeCreate(e.getID(rs), dimX, 0, 0, false, false, 0);
Type t = new Type(id, rs);
t.mElement = e;
t.mDimX = dimX;
t.calcElementCount();
return t;
}
/**
* Utility function for creating basic 2D types. The type is
* created without mipmaps or cubemaps.
*
* @param rs The RenderScript context
* @param e The Element for the Type
* @param dimX The X dimension, must be > 0
* @param dimY The Y dimension, must be > 0
*
* @return Type
*/
static public Type createXY(RenderScript rs, Element e, int dimX, int dimY) {
if ((dimX < 1) || (dimY < 1)) {
throw new RSInvalidStateException("Dimension must be >= 1.");
}
long id = rs.nTypeCreate(e.getID(rs), dimX, dimY, 0, false, false, 0);
Type t = new Type(id, rs);
t.mElement = e;
t.mDimX = dimX;
t.mDimY = dimY;
t.calcElementCount();
return t;
}
/**
* Utility function for creating basic 3D types. The type is
* created without mipmaps.
*
* @param rs The RenderScript context
* @param e The Element for the Type
* @param dimX The X dimension, must be > 0
* @param dimY The Y dimension, must be > 0
* @param dimZ The Z dimension, must be > 0
*
* @return Type
*/
static public Type createXYZ(RenderScript rs, Element e, int dimX, int dimY, int dimZ) {
if ((dimX < 1) || (dimY < 1) || (dimZ < 1)) {
throw new RSInvalidStateException("Dimension must be >= 1.");
}
long id = rs.nTypeCreate(e.getID(rs), dimX, dimY, dimZ, false, false, 0);
Type t = new Type(id, rs);
t.mElement = e;
t.mDimX = dimX;
t.mDimY = dimY;
t.mDimZ = dimZ;
t.calcElementCount();
return t;
}
/**
* Builder class for Type.
*
*/
public static class Builder {
RenderScript mRS;
int mDimX = 1;
int mDimY;
int mDimZ;
boolean mDimMipmaps;
boolean mDimFaces;
int mYuv;
Element mElement;
/**
* Create a new builder object.
*
* @param rs
* @param e The element for the type to be created.
*/
public Builder(RenderScript rs, Element e) {
e.checkValid();
mRS = rs;
mElement = e;
}
/**
* Add a dimension to the Type.
*
*
* @param value
*/
public Builder setX(int value) {
if(value < 1) {
throw new RSIllegalArgumentException("Values of less than 1 for Dimension X are not valid.");
}
mDimX = value;
return this;
}
public Builder setY(int value) {
if(value < 1) {
throw new RSIllegalArgumentException("Values of less than 1 for Dimension Y are not valid.");
}
mDimY = value;
return this;
}
public Builder setZ(int value) {
if(value < 1) {
throw new RSIllegalArgumentException("Values of less than 1 for Dimension Z are not valid.");
}
mDimZ = value;
return this;
}
public Builder setMipmaps(boolean value) {
mDimMipmaps = value;
return this;
}
public Builder setFaces(boolean value) {
mDimFaces = value;
return this;
}
/**
* Set the YUV layout for a Type.
*
* @param yuvFormat {@link android.graphics.ImageFormat#YV12}, {@link android.graphics.ImageFormat#NV21}, or
* {@link android.graphics.ImageFormat#YUV_420_888}.
*/
public Builder setYuvFormat(int yuvFormat) {
switch (yuvFormat) {
case android.graphics.ImageFormat.NV21:
case android.graphics.ImageFormat.YV12:
case android.graphics.ImageFormat.YUV_420_888:
break;
default:
throw new RSIllegalArgumentException(
"Only ImageFormat.NV21, .YV12, and .YUV_420_888 are supported..");
}
mYuv = yuvFormat;
return this;
}
/**
* Validate structure and create a new Type.
*
* @return Type
*/
public Type create() {
if (mDimZ > 0) {
if ((mDimX < 1) || (mDimY < 1)) {
throw new RSInvalidStateException("Both X and Y dimension required when Z is present.");
}
if (mDimFaces) {
throw new RSInvalidStateException("Cube maps not supported with 3D types.");
}
}
if (mDimY > 0) {
if (mDimX < 1) {
throw new RSInvalidStateException("X dimension required when Y is present.");
}
}
if (mDimFaces) {
if (mDimY < 1) {
throw new RSInvalidStateException("Cube maps require 2D Types.");
}
}
if (mYuv != 0) {
if ((mDimZ != 0) || mDimFaces || mDimMipmaps) {
throw new RSInvalidStateException("YUV only supports basic 2D.");
}
}
long id = mRS.nTypeCreate(mElement.getID(mRS),
mDimX, mDimY, mDimZ, mDimMipmaps, mDimFaces, mYuv);
Type t = new Type(id, mRS);
t.mElement = mElement;
t.mDimX = mDimX;
t.mDimY = mDimY;
t.mDimZ = mDimZ;
t.mDimMipmaps = mDimMipmaps;
t.mDimFaces = mDimFaces;
t.mDimYuv = mYuv;
t.calcElementCount();
return t;
}
}
}

View File

@@ -0,0 +1,10 @@
<HTML>
<BODY>
<p>RenderScript provides support for high-performance computation across heterogeneous processors.</p>
<p>For more information, see the
<a href="{@docRoot}guide/topics/renderscript/index.html">RenderScript</a> developer guide.</p>
{@more}
</BODY>
</HTML>