diff options
author | Jason Sams <rjsams@android.com> | 2009-07-28 12:02:16 -0700 |
---|---|---|
committer | Jason Sams <rjsams@android.com> | 2009-07-28 12:02:16 -0700 |
commit | b0ec1b46d6f5b5612e33fe43a828abea79b87a00 (patch) | |
tree | 3bf6193634273ec0cbf2e6a024f8afb315fb2f61 /libs/rs/java/Film | |
parent | 8af858e9b6577d074c5427e601b6418d288fdb9d (diff) | |
download | frameworks_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.c | 101 | ||||
-rw-r--r-- | libs/rs/java/Film/src/com/android/film/FilmRS.java | 110 |
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); |