Move RenderScript from graphics/ to new fw/base subdirectory rs.
Change-Id: I30b6633578f063840e1bdbcc9ba513b727912a6d
This commit is contained in:
1865
rs/java/android/renderscript/Allocation.java
Normal file
1865
rs/java/android/renderscript/Allocation.java
Normal file
File diff suppressed because it is too large
Load Diff
246
rs/java/android/renderscript/AllocationAdapter.java
Normal file
246
rs/java/android/renderscript/AllocationAdapter.java
Normal 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.");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
177
rs/java/android/renderscript/BaseObj.java
Normal file
177
rs/java/android/renderscript/BaseObj.java
Normal 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;
|
||||
}
|
||||
}
|
||||
|
||||
391
rs/java/android/renderscript/Byte2.java
Normal file
391
rs/java/android/renderscript/Byte2.java
Normal 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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
423
rs/java/android/renderscript/Byte3.java
Normal file
423
rs/java/android/renderscript/Byte3.java
Normal 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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
454
rs/java/android/renderscript/Byte4.java
Normal file
454
rs/java/android/renderscript/Byte4.java
Normal 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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
385
rs/java/android/renderscript/Double2.java
Normal file
385
rs/java/android/renderscript/Double2.java
Normal 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;
|
||||
}
|
||||
}
|
||||
417
rs/java/android/renderscript/Double3.java
Normal file
417
rs/java/android/renderscript/Double3.java
Normal 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;
|
||||
}
|
||||
}
|
||||
450
rs/java/android/renderscript/Double4.java
Normal file
450
rs/java/android/renderscript/Double4.java
Normal 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;
|
||||
}
|
||||
}
|
||||
1100
rs/java/android/renderscript/Element.java
Normal file
1100
rs/java/android/renderscript/Element.java
Normal file
File diff suppressed because it is too large
Load Diff
601
rs/java/android/renderscript/FieldPacker.java
Normal file
601
rs/java/android/renderscript/FieldPacker.java
Normal 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;
|
||||
|
||||
}
|
||||
|
||||
|
||||
309
rs/java/android/renderscript/FileA3D.java
Normal file
309
rs/java/android/renderscript/FileA3D.java
Normal 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;
|
||||
|
||||
}
|
||||
}
|
||||
384
rs/java/android/renderscript/Float2.java
Normal file
384
rs/java/android/renderscript/Float2.java
Normal 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;
|
||||
}
|
||||
}
|
||||
417
rs/java/android/renderscript/Float3.java
Normal file
417
rs/java/android/renderscript/Float3.java
Normal 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;
|
||||
}
|
||||
}
|
||||
450
rs/java/android/renderscript/Float4.java
Normal file
450
rs/java/android/renderscript/Float4.java
Normal 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;
|
||||
}
|
||||
}
|
||||
245
rs/java/android/renderscript/Font.java
Normal file
245
rs/java/android/renderscript/Font.java
Normal 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);
|
||||
}
|
||||
|
||||
}
|
||||
440
rs/java/android/renderscript/Int2.java
Normal file
440
rs/java/android/renderscript/Int2.java
Normal 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);
|
||||
}
|
||||
}
|
||||
477
rs/java/android/renderscript/Int3.java
Normal file
477
rs/java/android/renderscript/Int3.java
Normal 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);
|
||||
}
|
||||
}
|
||||
514
rs/java/android/renderscript/Int4.java
Normal file
514
rs/java/android/renderscript/Int4.java
Normal 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);
|
||||
}
|
||||
}
|
||||
440
rs/java/android/renderscript/Long2.java
Normal file
440
rs/java/android/renderscript/Long2.java
Normal 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);
|
||||
}
|
||||
}
|
||||
477
rs/java/android/renderscript/Long3.java
Normal file
477
rs/java/android/renderscript/Long3.java
Normal 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);
|
||||
}
|
||||
}
|
||||
514
rs/java/android/renderscript/Long4.java
Normal file
514
rs/java/android/renderscript/Long4.java
Normal 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);
|
||||
}
|
||||
}
|
||||
193
rs/java/android/renderscript/Matrix2f.java
Normal file
193
rs/java/android/renderscript/Matrix2f.java
Normal 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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
318
rs/java/android/renderscript/Matrix3f.java
Normal file
318
rs/java/android/renderscript/Matrix3f.java
Normal 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;
|
||||
}
|
||||
|
||||
|
||||
493
rs/java/android/renderscript/Matrix4f.java
Normal file
493
rs/java/android/renderscript/Matrix4f.java
Normal 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;
|
||||
}
|
||||
828
rs/java/android/renderscript/Mesh.java
Normal file
828
rs/java/android/renderscript/Mesh.java
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
87
rs/java/android/renderscript/Path.java
Normal file
87
rs/java/android/renderscript/Path.java
Normal 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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
370
rs/java/android/renderscript/Program.java
Normal file
370
rs/java/android/renderscript/Program.java
Normal 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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
96
rs/java/android/renderscript/ProgramFragment.java
Normal file
96
rs/java/android/renderscript/ProgramFragment.java
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
332
rs/java/android/renderscript/ProgramFragmentFixedFunction.java
Normal file
332
rs/java/android/renderscript/ProgramFragmentFixedFunction.java
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
168
rs/java/android/renderscript/ProgramRaster.java
Normal file
168
rs/java/android/renderscript/ProgramRaster.java
Normal 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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
442
rs/java/android/renderscript/ProgramStore.java
Normal file
442
rs/java/android/renderscript/ProgramStore.java
Normal 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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
154
rs/java/android/renderscript/ProgramVertex.java
Normal file
154
rs/java/android/renderscript/ProgramVertex.java
Normal 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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
287
rs/java/android/renderscript/ProgramVertexFixedFunction.java
Normal file
287
rs/java/android/renderscript/ProgramVertexFixedFunction.java
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
31
rs/java/android/renderscript/RSDriverException.java
Normal file
31
rs/java/android/renderscript/RSDriverException.java
Normal 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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
30
rs/java/android/renderscript/RSIllegalArgumentException.java
Normal file
30
rs/java/android/renderscript/RSIllegalArgumentException.java
Normal 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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
31
rs/java/android/renderscript/RSInvalidStateException.java
Normal file
31
rs/java/android/renderscript/RSInvalidStateException.java
Normal 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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
30
rs/java/android/renderscript/RSRuntimeException.java
Normal file
30
rs/java/android/renderscript/RSRuntimeException.java
Normal 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);
|
||||
}
|
||||
}
|
||||
|
||||
165
rs/java/android/renderscript/RSSurfaceView.java
Normal file
165
rs/java/android/renderscript/RSSurfaceView.java
Normal 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;
|
||||
}
|
||||
}
|
||||
194
rs/java/android/renderscript/RSTextureView.java
Normal file
194
rs/java/android/renderscript/RSTextureView.java
Normal 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;
|
||||
}
|
||||
}
|
||||
|
||||
1213
rs/java/android/renderscript/RenderScript.java
Normal file
1213
rs/java/android/renderscript/RenderScript.java
Normal file
File diff suppressed because it is too large
Load Diff
333
rs/java/android/renderscript/RenderScriptGL.java
Normal file
333
rs/java/android/renderscript/RenderScriptGL.java
Normal 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));
|
||||
}
|
||||
|
||||
}
|
||||
353
rs/java/android/renderscript/Sampler.java
Normal file
353
rs/java/android/renderscript/Sampler.java
Normal 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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
464
rs/java/android/renderscript/Script.java
Normal file
464
rs/java/android/renderscript/Script.java
Normal 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;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
106
rs/java/android/renderscript/ScriptC.java
Normal file
106
rs/java/android/renderscript/ScriptC.java
Normal 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);
|
||||
}
|
||||
}
|
||||
471
rs/java/android/renderscript/ScriptGroup.java
Normal file
471
rs/java/android/renderscript/ScriptGroup.java
Normal 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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
31
rs/java/android/renderscript/ScriptIntrinsic.java
Normal file
31
rs/java/android/renderscript/ScriptIntrinsic.java
Normal 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);
|
||||
}
|
||||
}
|
||||
99
rs/java/android/renderscript/ScriptIntrinsic3DLUT.java
Normal file
99
rs/java/android/renderscript/ScriptIntrinsic3DLUT.java
Normal 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);
|
||||
}
|
||||
}
|
||||
|
||||
464
rs/java/android/renderscript/ScriptIntrinsicBlend.java
Normal file
464
rs/java/android/renderscript/ScriptIntrinsicBlend.java
Normal 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);
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
108
rs/java/android/renderscript/ScriptIntrinsicBlur.java
Normal file
108
rs/java/android/renderscript/ScriptIntrinsicBlur.java
Normal 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);
|
||||
}
|
||||
}
|
||||
|
||||
263
rs/java/android/renderscript/ScriptIntrinsicColorMatrix.java
Normal file
263
rs/java/android/renderscript/ScriptIntrinsicColorMatrix.java
Normal 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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
131
rs/java/android/renderscript/ScriptIntrinsicConvolve3x3.java
Normal file
131
rs/java/android/renderscript/ScriptIntrinsicConvolve3x3.java
Normal 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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
131
rs/java/android/renderscript/ScriptIntrinsicConvolve5x5.java
Normal file
131
rs/java/android/renderscript/ScriptIntrinsicConvolve5x5.java
Normal 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);
|
||||
}
|
||||
}
|
||||
|
||||
182
rs/java/android/renderscript/ScriptIntrinsicHistogram.java
Normal file
182
rs/java/android/renderscript/ScriptIntrinsicHistogram.java
Normal 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);
|
||||
}
|
||||
}
|
||||
|
||||
142
rs/java/android/renderscript/ScriptIntrinsicLUT.java
Normal file
142
rs/java/android/renderscript/ScriptIntrinsicLUT.java
Normal 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);
|
||||
}
|
||||
}
|
||||
|
||||
89
rs/java/android/renderscript/ScriptIntrinsicYuvToRGB.java
Normal file
89
rs/java/android/renderscript/ScriptIntrinsicYuvToRGB.java
Normal 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);
|
||||
}
|
||||
}
|
||||
443
rs/java/android/renderscript/Short2.java
Normal file
443
rs/java/android/renderscript/Short2.java
Normal 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);
|
||||
}
|
||||
}
|
||||
477
rs/java/android/renderscript/Short3.java
Normal file
477
rs/java/android/renderscript/Short3.java
Normal 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);
|
||||
}
|
||||
}
|
||||
514
rs/java/android/renderscript/Short4.java
Normal file
514
rs/java/android/renderscript/Short4.java
Normal 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);
|
||||
}
|
||||
}
|
||||
426
rs/java/android/renderscript/Type.java
Normal file
426
rs/java/android/renderscript/Type.java
Normal 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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
10
rs/java/android/renderscript/package.html
Normal file
10
rs/java/android/renderscript/package.html
Normal 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>
|
||||
Reference in New Issue
Block a user