summaryrefslogtreecommitdiffstats
path: root/libs/rs/java/Film
diff options
context:
space:
mode:
authorJason Sams <rjsams@android.com>2009-07-28 12:02:16 -0700
committerJason Sams <rjsams@android.com>2009-07-28 12:02:16 -0700
commitb0ec1b46d6f5b5612e33fe43a828abea79b87a00 (patch)
tree3bf6193634273ec0cbf2e6a024f8afb315fb2f61 /libs/rs/java/Film
parent8af858e9b6577d074c5427e601b6418d288fdb9d (diff)
downloadframeworks_base-b0ec1b46d6f5b5612e33fe43a828abea79b87a00.zip
frameworks_base-b0ec1b46d6f5b5612e33fe43a828abea79b87a00.tar.gz
frameworks_base-b0ec1b46d6f5b5612e33fe43a828abea79b87a00.tar.bz2
Add "boxed" bitmap uploads which simply place a non-pow2 bitmap into the smallest larger pow texture. The added space is filled black.
Diffstat (limited to 'libs/rs/java/Film')
-rw-r--r--libs/rs/java/Film/res/raw/filmstrip.c101
-rw-r--r--libs/rs/java/Film/src/com/android/film/FilmRS.java110
2 files changed, 145 insertions, 66 deletions
diff --git a/libs/rs/java/Film/res/raw/filmstrip.c b/libs/rs/java/Film/res/raw/filmstrip.c
index 6885251..495fe55 100644
--- a/libs/rs/java/Film/res/raw/filmstrip.c
+++ b/libs/rs/java/Film/res/raw/filmstrip.c
@@ -11,29 +11,29 @@ typedef struct FilmScriptUserEnvRec {
int32_t triangleOffsets[64];
float triangleOffsetsTex[64];
int32_t triangleOffsetsCount;
-} FilmScriptUserEnv;
-*/
+} FilmScriptUserEnv;
+*/
+
+#define POS_TRANSLATE 0
+#define POS_ROTATE 1
+#define POS_FOCUS 2
+
+#define STATE_TRIANGLE_OFFSET_COUNT 0
+#define STATE_LAST_FOCUS 1
+
// The script enviroment has 3 env allocations.
// bank0: (r) The enviroment structure
// bank1: (r) The position information
// bank2: (rw) The temporary texture state
-int main(int index)
+int main(int index)
{
int f1,f2,f3,f4, f5,f6,f7,f8, f9,f10,f11,f12, f13,f14,f15,f16;
int g1,g2,g3,g4, g5,g6,g7,g8, g9,g10,g11,g12, g13,g14,g15,g16;
- float trans;
- float rot;
- int x;
- float focusPos; // float
- int focusID;
- int lastFocusID;
- int imgCount;
-
- trans = loadF(1, 0);
- rot = loadF(1, 1);
+ float trans = loadF(1, POS_TRANSLATE);
+ float rot = loadF(1, POS_ROTATE);
matrixLoadScale(&f16, 2.f, 2.f, 2.f);
matrixTranslate(&f16, 0.f, 0.f, trans);
matrixRotate(&f16, 90.f, 0.f, 0.f, 1.f);
@@ -46,24 +46,18 @@ int main(int index)
drawTriangleMesh(NAMED_mesh);
-
- //int imgId = 0;
-
+ // Start of images.
bindProgramFragmentStore(NAMED_PFImages);
bindProgramFragment(NAMED_PFSImages);
bindProgramVertex(NAMED_PVImages);
- //focusPos = loadF(1, 2);
- //focusID = 0;
- //lastFocusID = loadI32(2, 0);
- //imgCount = 13;
-
- /*
- disable(GL_LIGHTING);
-
+ float focusPos = loadF(1, POS_FOCUS);
+ int focusID = 0;
+ int lastFocusID = loadI32(2, STATE_LAST_FOCUS);
+ int imgCount = 13;
- if (trans > (-.3)) {
- focusID = -1.0 - focusPos;
+ if (trans > (-.3f)) {
+ focusID = -1.0f - focusPos;
if (focusID >= imgCount) {
focusID = -1;
}
@@ -71,6 +65,7 @@ int main(int index)
focusID = -1;
}
+ /*
if (focusID != lastFocusID) {
if (lastFocusID >= 0) {
uploadToTexture(con, env->tex[lastFocusID], 1);
@@ -79,36 +74,38 @@ int main(int index)
uploadToTexture(con, env->tex[focusID], 0);
}
}
- storeEnvI32(con, 2, 0, focusID);
+ */
+ storeI32(2, STATE_LAST_FOCUS, focusID);
+ int triangleOffsetsCount = loadI32(2, STATE_TRIANGLE_OFFSET_COUNT);
+ int imgId = 0;
for (imgId=1; imgId <= imgCount; imgId++) {
- float pos = focusPos + imgId + .4f;
- int offset = (int)floor(pos*2);
- pos -= 0.75;
-
- offset += env->triangleOffsetsCount / 2;
-
- if ((offset < 0) || (offset >= env->triangleOffsetsCount)) {
- continue;
- }
-
- int start = offset -2;
- int end = offset + 2;
-
- if (start < 0) {
- start = 0;
- }
- if (end > env->triangleOffsetsCount) {
- end = env->triangleOffsetsCount;
+ float pos = focusPos + imgId + 0.4f;
+ int offset = (int)floorf(pos * 2.f);
+ pos = pos - 0.75f;
+
+ offset = offset + triangleOffsetsCount / 2;
+
+ if (!((offset < 0) || (offset >= triangleOffsetsCount))) {
+ int start = offset -2;
+ int end = offset + 2;
+
+ if (start < 0) {
+ start = 0;
+ }
+ if (end > triangleOffsetsCount) {
+ end = triangleOffsetsCount;
+ }
+
+ bindTexture(NAMED_PFImages, 0, loadI32(0, imgId - 1));
+ /*
+ matrixLoadTranslate(con, &m, -pos - env->triangleOffsetsTex[env->triangleOffsetsCount / 2], 0, 0);
+ storeEnvMatrix(con, 3, RS_PROGRAM_VERTEX_TEXTURE_OFFSET, &m);
+ renderTriangleMeshRange(con, env->mesh, env->triangleOffsets[start], env->triangleOffsets[end] - env->triangleOffsets[start]);
+ */
}
-
- programFragmentBindTexture(con, env->fpImages, 0, env->tex[imgId - 1]);
- matrixLoadTranslate(con, &m, -pos - env->triangleOffsetsTex[env->triangleOffsetsCount / 2], 0, 0);
- storeEnvMatrix(con, 3, RS_PROGRAM_VERTEX_TEXTURE_OFFSET, &m);
- renderTriangleMeshRange(con, env->mesh, env->triangleOffsets[start], env->triangleOffsets[end] - env->triangleOffsets[start]);
- }
-*/
+ }
return 0;
}
diff --git a/libs/rs/java/Film/src/com/android/film/FilmRS.java b/libs/rs/java/Film/src/com/android/film/FilmRS.java
index fca0818..395bd35 100644
--- a/libs/rs/java/Film/src/com/android/film/FilmRS.java
+++ b/libs/rs/java/Film/src/com/android/film/FilmRS.java
@@ -25,6 +25,7 @@ import android.renderscript.Matrix;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Handler;
@@ -38,6 +39,12 @@ import android.view.KeyEvent;
import android.view.MotionEvent;
public class FilmRS {
+ private final int POS_TRANSLATE = 0;
+ private final int POS_ROTATE = 1;
+ private final int POS_FOCUS = 2;
+
+ private final int STATE_TRIANGLE_OFFSET_COUNT = 0;
+ private final int STATE_LAST_FOCUS = 1;
public FilmRS() {
}
@@ -56,11 +63,11 @@ public class FilmRS {
if (x > 270) {
x = 270;
}
-
+
float anim = ((float)x-50) / 270.f;
- mBufferPos[0] = 2f * anim + 0.5f; // translation
- mBufferPos[1] = (anim * 40); // rotation
- mBufferPos[2] = ((float)y) / 16.f - 8; // focusPos
+ mBufferPos[POS_TRANSLATE] = 2f * anim + 0.5f; // translation
+ mBufferPos[POS_ROTATE] = (anim * 40); // rotation
+ mBufferPos[POS_FOCUS] = ((float)y) / 16.f - 8; // focusPos
mAllocPos.data(mBufferPos);
}
@@ -80,15 +87,19 @@ public class FilmRS {
private RenderScript.ProgramVertex mPVImages;
private ProgramVertexAlloc mPVA;
- private RenderScript.Allocation mAllocEnv;
+ private RenderScript.Allocation mImages[];
+ private RenderScript.Allocation mAllocIDs;
private RenderScript.Allocation mAllocPos;
private RenderScript.Allocation mAllocState;
private RenderScript.Allocation mAllocPV;
private RenderScript.TriangleMesh mMesh;
private RenderScript.Light mLight;
- private float[] mBufferPos;
- private float[] mBufferPV;
+ private FilmStripMesh mFSM;
+
+ private int[] mBufferIDs;
+ private float[] mBufferPos = new float[3];
+ private int[] mBufferState;
private void initSamplers() {
mRS.samplerBegin();
@@ -112,7 +123,7 @@ public class FilmRS {
mRS.programFragmentStoreDepthFunc(RenderScript.DepthFunc.EQUAL);
mRS.programFragmentStoreDitherEnable(false);
mRS.programFragmentStoreDepthMask(false);
- mRS.programFragmentStoreBlendFunc(RenderScript.BlendSrcFunc.ONE,
+ mRS.programFragmentStoreBlendFunc(RenderScript.BlendSrcFunc.ONE,
RenderScript.BlendDstFunc.ONE);
mPFSImages = mRS.programFragmentStoreCreate();
mPFSImages.setName("PFSImages");
@@ -148,7 +159,75 @@ public class FilmRS {
}
- int mParams[] = new int[10];
+ private void loadImages() {
+ mBufferIDs = new int[13];
+ mImages = new RenderScript.Allocation[13];
+ mAllocIDs = mRS.allocationCreatePredefSized(
+ RenderScript.ElementPredefined.USER_FLOAT,
+ mBufferIDs.length);
+
+ Bitmap b;
+ BitmapFactory.Options opts = new BitmapFactory.Options();
+ opts.inScaled = false;
+
+ b = BitmapFactory.decodeResource(mRes, R.drawable.p01, opts);
+ mImages[0] = mRS.allocationCreateFromBitmapBoxed(b, RenderScript.ElementPredefined.RGB_565, true);
+
+ b = BitmapFactory.decodeResource(mRes, R.drawable.p02, opts);
+ mImages[1] = mRS.allocationCreateFromBitmapBoxed(b, RenderScript.ElementPredefined.RGB_565, true);
+
+ b = BitmapFactory.decodeResource(mRes, R.drawable.p03, opts);
+ mImages[2] = mRS.allocationCreateFromBitmapBoxed(b, RenderScript.ElementPredefined.RGB_565, true);
+
+ b = BitmapFactory.decodeResource(mRes, R.drawable.p04, opts);
+ mImages[3] = mRS.allocationCreateFromBitmapBoxed(b, RenderScript.ElementPredefined.RGB_565, true);
+
+ b = BitmapFactory.decodeResource(mRes, R.drawable.p05, opts);
+ mImages[4] = mRS.allocationCreateFromBitmapBoxed(b, RenderScript.ElementPredefined.RGB_565, true);
+
+ b = BitmapFactory.decodeResource(mRes, R.drawable.p06, opts);
+ mImages[5] = mRS.allocationCreateFromBitmapBoxed(b, RenderScript.ElementPredefined.RGB_565, true);
+
+ b = BitmapFactory.decodeResource(mRes, R.drawable.p07, opts);
+ mImages[6] = mRS.allocationCreateFromBitmapBoxed(b, RenderScript.ElementPredefined.RGB_565, true);
+
+ b = BitmapFactory.decodeResource(mRes, R.drawable.p08, opts);
+ mImages[7] = mRS.allocationCreateFromBitmapBoxed(b, RenderScript.ElementPredefined.RGB_565, true);
+
+ b = BitmapFactory.decodeResource(mRes, R.drawable.p09, opts);
+ mImages[8] = mRS.allocationCreateFromBitmapBoxed(b, RenderScript.ElementPredefined.RGB_565, true);
+
+ b = BitmapFactory.decodeResource(mRes, R.drawable.p10, opts);
+ mImages[9] = mRS.allocationCreateFromBitmapBoxed(b, RenderScript.ElementPredefined.RGB_565, true);
+
+ b = BitmapFactory.decodeResource(mRes, R.drawable.p11, opts);
+ mImages[10] = mRS.allocationCreateFromBitmapBoxed(b, RenderScript.ElementPredefined.RGB_565, true);
+
+ b = BitmapFactory.decodeResource(mRes, R.drawable.p12, opts);
+ mImages[11] = mRS.allocationCreateFromBitmapBoxed(b, RenderScript.ElementPredefined.RGB_565, true);
+
+ b = BitmapFactory.decodeResource(mRes, R.drawable.p13, opts);
+ mImages[12] = mRS.allocationCreateFromBitmapBoxed(b, RenderScript.ElementPredefined.RGB_565, true);
+
+ for(int ct=0; ct < mImages.length; ct++) {
+ mImages[ct].uploadToTexture(1);
+ mBufferIDs[ct] = mImages[ct].getID();
+ }
+ mAllocIDs.data(mBufferIDs);
+ }
+
+ private void initState()
+ {
+ mBufferState = new int[10];
+ mAllocState = mRS.allocationCreatePredefSized(
+ RenderScript.ElementPredefined.USER_FLOAT,
+ mBufferState.length);
+
+ mBufferState[STATE_TRIANGLE_OFFSET_COUNT] = mFSM.mTriangleOffsetsCount;
+ mBufferState[STATE_LAST_FOCUS] = -1;
+
+ mAllocState.data(mBufferState);
+ }
private void initRS() {
mElementVertex = mRS.elementGetPredefined(
@@ -157,8 +236,8 @@ public class FilmRS {
RenderScript.ElementPredefined.INDEX_16);
mRS.triangleMeshBegin(mElementVertex, mElementIndex);
- FilmStripMesh fsm = new FilmStripMesh();
- fsm.init(mRS);
+ mFSM = new FilmStripMesh();
+ mFSM.init(mRS);
mMesh = mRS.triangleMeshCreate();
mMesh.setName("mesh");
@@ -176,19 +255,22 @@ public class FilmRS {
mRS.scriptCSetRoot(true);
mScriptStrip = mRS.scriptCCreate();
- mBufferPos = new float[3];
mAllocPos = mRS.allocationCreatePredefSized(
- RenderScript.ElementPredefined.USER_FLOAT,
+ RenderScript.ElementPredefined.USER_FLOAT,
mBufferPos.length);
+ loadImages();
+ initState();
+
mPVA = new ProgramVertexAlloc(mRS);
mPVBackground.bindAllocation(0, mPVA.mAlloc);
mPVImages.bindAllocation(0, mPVA.mAlloc);
mPVA.setupProjectionNormalized(320, 480);
+ mScriptStrip.bindAllocation(mAllocIDs, 0);
mScriptStrip.bindAllocation(mAllocPos, 1);
- //mScriptStrip.bindAllocation(gStateAlloc, 2);
+ mScriptStrip.bindAllocation(mAllocState, 2);
mScriptStrip.bindAllocation(mPVA.mAlloc, 3);