summaryrefslogtreecommitdiffstats
path: root/carousel/java/com/android/ex/carousel/CarouselRS.java
diff options
context:
space:
mode:
Diffstat (limited to 'carousel/java/com/android/ex/carousel/CarouselRS.java')
-rw-r--r--carousel/java/com/android/ex/carousel/CarouselRS.java949
1 files changed, 0 insertions, 949 deletions
diff --git a/carousel/java/com/android/ex/carousel/CarouselRS.java b/carousel/java/com/android/ex/carousel/CarouselRS.java
deleted file mode 100644
index 9d78d09..0000000
--- a/carousel/java/com/android/ex/carousel/CarouselRS.java
+++ /dev/null
@@ -1,949 +0,0 @@
-/*
- * 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 com.android.ex.carousel;
-
-import android.content.res.Resources;
-import android.graphics.Bitmap;
-import android.graphics.Rect;
-import android.renderscript.*;
-import static android.renderscript.Element.*;
-import android.renderscript.Program.TextureType;
-import android.renderscript.RenderScript.RSMessageHandler;
-import android.util.Log;
-
-/**
- * This is a support class for Carousel renderscript. It handles most of the low-level interactions
- * with Renderscript as well as dispatching events.
- *
- */
-public class CarouselRS {
- private static final int DEFAULT_VISIBLE_SLOTS = 1;
- private static final int DEFAULT_CARD_COUNT = 0;
- private static final int DEFAULT_ROW_COUNT = 1;
-
- // Client messages *** THIS LIST MUST MATCH THOSE IN carousel.rs ***
- public static final int CMD_CARD_SELECTED = 100;
- public static final int CMD_DETAIL_SELECTED = 105;
- public static final int CMD_CARD_LONGPRESS = 110;
- public static final int CMD_REQUEST_TEXTURE = 200;
- public static final int CMD_INVALIDATE_TEXTURE = 210;
- public static final int CMD_REQUEST_GEOMETRY = 300;
- public static final int CMD_INVALIDATE_GEOMETRY = 310;
- public static final int CMD_ANIMATION_STARTED = 400;
- public static final int CMD_ANIMATION_FINISHED = 500;
- public static final int CMD_REQUEST_DETAIL_TEXTURE = 600;
- public static final int CMD_INVALIDATE_DETAIL_TEXTURE = 610;
- public static final int CMD_PING = 1000; // for debugging
-
- // Drag models *** THIS LIST MUST MATCH THOSE IN carousel.rs ***
- public static final int DRAG_MODEL_SCREEN_DELTA = 0;
- public static final int DRAG_MODEL_PLANE = 1;
- public static final int DRAG_MODEL_CYLINDER_INSIDE = 2;
- public static final int DRAG_MODEL_CYLINDER_OUTSIDE = 3;
-
- public static final int FILL_DIRECTION_CCW = +1;
- public static final int FILL_DIRECTION_CW = -1;
-
- private static final String TAG = "CarouselRS";
- private static final int DEFAULT_SLOT_COUNT = 10;
- private static final Allocation.MipmapControl MIPMAP =
- Allocation.MipmapControl.MIPMAP_NONE;
- private static final boolean DBG = false;
-
- private RenderScriptGL mRS;
- private Resources mRes;
- private ScriptC_carousel mScript;
- private ScriptField_Card mCards;
- private ScriptField_FragmentShaderConstants_s mFSConst;
- private ScriptField_ProgramStore_s mProgramStoresCard;
- private ProgramFragment mSingleTextureFragmentProgram;
- private ProgramFragment mSingleTextureBlendingFragmentProgram;
- private ProgramFragment mMultiTextureFragmentProgram;
- private ProgramFragment mMultiTextureBlendingFragmentProgram;
- private ProgramVertex mVertexProgram;
- private ProgramRaster mRasterProgram;
- private Allocation[] mAllocationPool;
- private boolean mForceBlendCardsWithZ;
- private int mVisibleSlots;
- private int mRowCount;
- private int mPrefetchCardCount;
- private CarouselCallback mCallback;
- private float[] mEyePoint = new float[] { 2.0f, 0.0f, 0.0f };
- private float[] mAtPoint = new float[] { 0.0f, 0.0f, 0.0f };
- private float[] mUp = new float[] { 0.0f, 1.0f, 0.0f };
-
- private static final String mSingleTextureShader = new String(
- "varying vec2 varTex0;" +
- "void main() {" +
- "vec2 t0 = varTex0.xy;" +
- "vec4 col = texture2D(UNI_Tex0, t0);" +
- "gl_FragColor = col; " +
- "}");
-
- private static final String mSingleTextureBlendingShader = new String(
- "varying vec2 varTex0;" +
- "void main() {" +
- "vec2 t0 = varTex0.xy;" +
- "vec4 col = texture2D(UNI_Tex0, t0);" +
- "gl_FragColor = col * UNI_overallAlpha; " +
- "}");
-
- private static final String mMultiTextureShader = new String(
- "varying vec2 varTex0;" +
- "void main() {" +
- "vec2 t0 = varTex0.xy;" +
- "vec4 col = texture2D(UNI_Tex0, t0);" +
- "vec4 col2 = texture2D(UNI_Tex1, t0);" +
- "gl_FragColor = mix(col, col2, UNI_fadeAmount);}");
-
- private static final String mMultiTextureBlendingShader = new String(
- "varying vec2 varTex0;" +
- "void main() {" +
- "vec2 t0 = varTex0.xy;" +
- "vec4 col = texture2D(UNI_Tex0, t0);" +
- "vec4 col2 = texture2D(UNI_Tex1, t0);" +
- "gl_FragColor = mix(col, col2, UNI_fadeAmount) * UNI_overallAlpha;" +
- "}"
- );
-
- public static interface CarouselCallback {
- /**
- * Called when a card is selected
- * @param n the id of the card
- */
- void onCardSelected(int n);
-
- /**
- * Called when the detail texture for a card is tapped
- * @param n the id of the card
- * @param x how far the user tapped from the left edge of the card, in pixels
- * @param y how far the user tapped from the top edge of the card, in pixels
- */
- void onDetailSelected(int n, int x, int y);
-
- /**
- * Called when a card is long-pressed
- * @param n the id of the card
- * @param touchPosition position of where the user pressed, in screen coordinates
- * @param detailCoordinates position of detail texture, in screen coordinates
- */
- void onCardLongPress(int n, int touchPosition[], Rect detailCoordinates);
-
- /**
- * Called when texture is needed for card n. This happens when the given card becomes
- * visible.
- * @param n the id of the card
- */
- void onRequestTexture(int n);
-
- /**
- * Called when a texture is no longer needed for card n. This happens when the card
- * goes out of view.
- * @param n the id of the card
- */
- void onInvalidateTexture(int n);
-
- /**
- * Called when detail texture is needed for card n. This happens when the given card
- * becomes visible.
- * @param n the id of the card
- */
- void onRequestDetailTexture(int n);
-
- /**
- * Called when a detail texture is no longer needed for card n. This happens when the card
- * goes out of view.
- * @param n the id of the card
- */
- void onInvalidateDetailTexture(int n);
-
- /**
- * Called when geometry is needed for card n.
- * @param n the id of the card.
- */
- void onRequestGeometry(int n);
-
- /**
- * Called when geometry is no longer needed for card n. This happens when the card goes
- * out of view.
- * @param n the id of the card
- */
- void onInvalidateGeometry(int n);
-
- /**
- * Called when card animation (e.g. a fling) has started.
- */
- void onAnimationStarted();
-
- /**
- * Called when card animation has stopped.
- * @param carouselRotationAngle the angle of rotation, in radians, at which the animation
- * stopped.
- */
- void onAnimationFinished(float carouselRotationAngle);
- };
-
- private RSMessageHandler mRsMessage = new RSMessageHandler() {
- public void run() {
- if (mCallback == null) return;
- switch (mID) {
- case CMD_CARD_SELECTED:
- mCallback.onCardSelected(mData[0]);
- break;
-
- case CMD_DETAIL_SELECTED:
- mCallback.onDetailSelected(mData[0], mData[1], mData[2]);
- break;
-
- case CMD_CARD_LONGPRESS:
- int touchPosition[] = { mData[1], mData[2] };
- Rect detailCoordinates = new Rect(mData[3], mData[4], mData[5], mData[6]);
- mCallback.onCardLongPress(mData[0], touchPosition, detailCoordinates);
- break;
-
- case CMD_REQUEST_TEXTURE:
- mCallback.onRequestTexture(mData[0]);
- break;
-
- case CMD_INVALIDATE_TEXTURE:
- setTexture(mData[0], null);
- mCallback.onInvalidateTexture(mData[0]);
- break;
-
- case CMD_REQUEST_DETAIL_TEXTURE:
- mCallback.onRequestDetailTexture(mData[0]);
- break;
-
- case CMD_INVALIDATE_DETAIL_TEXTURE:
- setDetailTexture(mData[0], 0.0f, 0.0f, 0.0f, 0.0f, null);
- mCallback.onInvalidateDetailTexture(mData[0]);
- break;
-
- case CMD_REQUEST_GEOMETRY:
- mCallback.onRequestGeometry(mData[0]);
- break;
-
- case CMD_INVALIDATE_GEOMETRY:
- setGeometry(mData[0], null);
- mCallback.onInvalidateGeometry(mData[0]);
- break;
-
- case CMD_ANIMATION_STARTED:
- mCallback.onAnimationStarted();
- break;
-
- case CMD_ANIMATION_FINISHED:
- mCallback.onAnimationFinished(Float.intBitsToFloat(mData[0]));
- break;
-
- case CMD_PING:
- if (DBG) Log.v(TAG, "PING...");
- break;
-
- default:
- Log.e(TAG, "Unknown RSMessage: " + mID);
- }
- }
- };
-
- public CarouselRS(RenderScriptGL rs, Resources res, int resId) {
- mRS = rs;
- mRes = res;
-
- // create the script object
- mScript = new ScriptC_carousel(mRS, mRes, resId);
- mRS.setMessageHandler(mRsMessage);
- initProgramStore();
- initFragmentProgram();
- initRasterProgram();
- initVertexProgram();
- setSlotCount(DEFAULT_SLOT_COUNT);
- setVisibleSlots(DEFAULT_VISIBLE_SLOTS);
- setRowCount(DEFAULT_ROW_COUNT);
- createCards(DEFAULT_CARD_COUNT);
- setStartAngle(0.0f);
- setCarouselRotationAngle(0.0f);
- setRadius(1.0f);
- setLookAt(mEyePoint, mAtPoint, mUp);
- setRadius(20.0f);
- // Fov: 25
- }
-
- public void setLookAt(float[] eye, float[] at, float[] up) {
- for (int i = 0; i < 3; i++) {
- mEyePoint[i] = eye[i];
- mAtPoint[i] = at[i];
- mUp[i] = up[i];
- }
- mScript.invoke_lookAt(eye[0], eye[1], eye[2], at[0], at[1], at[2], up[0], up[1], up[2]);
- }
-
- public void setRadius(float radius) {
- mScript.invoke_setRadius(radius);
- }
-
- public void setCardRotation(float cardRotation) {
- mScript.set_cardRotation(cardRotation);
- }
-
- public void setCardsFaceTangent(boolean faceTangent) {
- mScript.set_cardsFaceTangent(faceTangent);
- }
-
- public void setSwaySensitivity(float swaySensitivity) {
- mScript.set_swaySensitivity(swaySensitivity);
- }
-
- public void setFrictionCoefficient(float frictionCoeff) {
- mScript.set_frictionCoeff(frictionCoeff);
- }
-
- public void setDragFactor(float dragFactor) {
- mScript.set_dragFactor(dragFactor);
- }
-
- public void setDragModel(int model) {
- mScript.set_dragModel(model);
- }
-
- public void setFillDirection(int direction) {
- mScript.set_fillDirection(direction);
- }
-
- private Matrix4f matrixFromFloat(float[] matrix) {
- int dimensions;
- if (matrix == null || matrix.length == 0) {
- dimensions = 0;
- } else if (matrix.length == 16) {
- dimensions = 4;
- } else if (matrix.length == 9) {
- dimensions = 3;
- } else {
- throw new IllegalArgumentException("matrix length not 0,9 or 16");
- }
-
- Matrix4f rsMatrix = new Matrix4f(); // initialized as identity.
- for (int i = 0; i < dimensions; i++) {
- for (int j = 0; j < dimensions; j++) {
- rsMatrix.set(i, j, matrix[i*dimensions + j]);
- }
- }
-
- return rsMatrix;
- }
-
- public void setDefaultCardMatrix(float[] matrix) {
- mScript.set_defaultCardMatrix(matrixFromFloat(matrix));
- }
-
- private void initVertexProgram() {
- ProgramVertexFixedFunction.Builder pvb = new ProgramVertexFixedFunction.Builder(mRS);
- mVertexProgram = pvb.create();
- ProgramVertexFixedFunction.Constants pva = new ProgramVertexFixedFunction.Constants(mRS);
- ((ProgramVertexFixedFunction)mVertexProgram).bindConstants(pva);
- Matrix4f proj = new Matrix4f();
- proj.loadProjectionNormalized(1, 1);
- pva.setProjection(proj);
- mScript.set_vertexProgram(mVertexProgram);
- }
-
- private void initRasterProgram() {
- ProgramRaster.Builder programRasterBuilder = new ProgramRaster.Builder(mRS);
- mRasterProgram = programRasterBuilder.create();
- //mRasterProgram.setCullMode(CullMode.NONE);
- mScript.set_rasterProgram(mRasterProgram);
- }
-
- private void initFragmentProgram() {
- //
- // Single texture program
- //
- ProgramFragment.Builder pfbSingle = new ProgramFragment.Builder(mRS);
- // Specify the resource that contains the shader string
- pfbSingle.setShader(mSingleTextureShader);
- // Tell the builder how many textures we have
- pfbSingle.addTexture(Program.TextureType.TEXTURE_2D);
- mSingleTextureFragmentProgram = pfbSingle.create();
- // Bind the source of constant data
- mSingleTextureFragmentProgram.bindSampler(Sampler.CLAMP_LINEAR(mRS), 0);
-
- //
- // Single texture program, plus blending
- //
- mFSConst = new ScriptField_FragmentShaderConstants_s(mRS, 1);
- mScript.bind_shaderConstants(mFSConst);
- ProgramFragment.Builder pfbSingleBlend = new ProgramFragment.Builder(mRS);
- // Specify the resource that contains the shader string
- pfbSingleBlend.setShader(mSingleTextureBlendingShader);
- // Tell the builder how many textures we have
- pfbSingleBlend.addTexture(Program.TextureType.TEXTURE_2D);
- // Define the constant input layout
- pfbSingleBlend.addConstant(mFSConst.getAllocation().getType());
- mSingleTextureBlendingFragmentProgram = pfbSingleBlend.create();
- // Bind the source of constant data
- mSingleTextureBlendingFragmentProgram.bindConstants(mFSConst.getAllocation(), 0);
- mSingleTextureBlendingFragmentProgram.bindSampler(Sampler.CLAMP_LINEAR(mRS), 0);
-
- //
- // Multi texture program
- //
- ProgramFragment.Builder pfbMulti = new ProgramFragment.Builder(mRS);
- // Specify the resource that contains the shader string
- pfbMulti.setShader(mMultiTextureShader);
- // Tell the builder how many textures we have
- pfbMulti.addTexture(Program.TextureType.TEXTURE_2D);
- pfbMulti.addTexture(Program.TextureType.TEXTURE_2D);
- // Define the constant input layout
- pfbMulti.addConstant(mFSConst.getAllocation().getType());
- mMultiTextureFragmentProgram = pfbMulti.create();
- // Bind the source of constant data
- mMultiTextureFragmentProgram.bindConstants(mFSConst.getAllocation(), 0);
- mMultiTextureFragmentProgram.bindSampler(Sampler.CLAMP_LINEAR(mRS), 0);
- mMultiTextureFragmentProgram.bindSampler(Sampler.CLAMP_LINEAR(mRS), 1);
-
- //
- // Multi texture program, plus blending
- //
- ProgramFragment.Builder pfbMultiBlend = new ProgramFragment.Builder(mRS);
- // Specify the resource that contains the shader string
- pfbMultiBlend.setShader(mMultiTextureBlendingShader);
- // Tell the builder how many textures we have
- pfbMultiBlend.addTexture(Program.TextureType.TEXTURE_2D);
- pfbMultiBlend.addTexture(Program.TextureType.TEXTURE_2D);
- // Define the constant input layout
- pfbMultiBlend.addConstant(mFSConst.getAllocation().getType());
- mMultiTextureBlendingFragmentProgram = pfbMultiBlend.create();
- // Bind the source of constant data
- mMultiTextureBlendingFragmentProgram.bindConstants(mFSConst.getAllocation(), 0);
- mMultiTextureBlendingFragmentProgram.bindSampler(Sampler.CLAMP_LINEAR(mRS), 0);
- mMultiTextureBlendingFragmentProgram.bindSampler(Sampler.CLAMP_LINEAR(mRS), 1);
-
- mScript.set_linearClamp(Sampler.CLAMP_LINEAR(mRS));
- mScript.set_singleTextureFragmentProgram(mSingleTextureFragmentProgram);
- mScript.set_singleTextureBlendingFragmentProgram(mSingleTextureBlendingFragmentProgram);
- mScript.set_multiTextureFragmentProgram(mMultiTextureFragmentProgram);
- mScript.set_multiTextureBlendingFragmentProgram(mMultiTextureBlendingFragmentProgram);
- }
-
- private void initProgramStore() {
- resizeProgramStoresCard(1);
-
- final boolean dither = true;
- final ProgramStore.DepthFunc depthFunc = mForceBlendCardsWithZ ?
- ProgramStore.DepthFunc.LESS : ProgramStore.DepthFunc.ALWAYS;
-
- // Background: Alpha disabled, depth optional
- mScript.set_programStoreBackground(new ProgramStore.Builder(mRS)
- .setBlendFunc(ProgramStore.BlendSrcFunc.ONE, ProgramStore.BlendDstFunc.ZERO)
- .setDitherEnabled(dither)
- .setDepthFunc(depthFunc)
- .setDepthMaskEnabled(mForceBlendCardsWithZ)
- .create());
-
- // Card: Alpha enabled, depth optional
- setProgramStoreCard(0, new ProgramStore.Builder(mRS)
- .setBlendFunc(ProgramStore.BlendSrcFunc.ONE,
- ProgramStore.BlendDstFunc.ONE_MINUS_SRC_ALPHA)
- .setDitherEnabled(dither)
- .setDepthFunc(depthFunc)
- .setDepthMaskEnabled(mForceBlendCardsWithZ)
- .create());
-
- // Detail: Alpha enabled, depth disabled
- mScript.set_programStoreDetail(new ProgramStore.Builder(mRS)
- .setBlendFunc(ProgramStore.BlendSrcFunc.ONE,
- ProgramStore.BlendDstFunc.ONE_MINUS_SRC_ALPHA)
- .setDitherEnabled(dither)
- .setDepthFunc(ProgramStore.DepthFunc.ALWAYS)
- .setDepthMaskEnabled(false)
- .create());
- }
-
- public void createCards(int count)
- {
- // Because RenderScript can't have allocations with 0 dimensions, we always create
- // an allocation of at least one card. This relies on invoke_createCards() to keep
- // track of when the allocation is not valid.
- if (mCards != null && count > 0) {
- // resize the array
- int oldSize = mCards.getAllocation().getType().getX();
- mCards.resize(count);
- mScript.invoke_createCards(oldSize, count);
- } else {
- // create array from scratch
- mCards = new ScriptField_Card(mRS, count > 0 ? count : 1);
- mScript.bind_cards(mCards);
- mScript.invoke_createCards(0, count);
- }
- }
-
- public void setVisibleSlots(int count)
- {
- mVisibleSlots = count;
- mScript.set_visibleSlotCount(count);
- }
-
- public void setVisibleDetails(int count) {
- mScript.set_visibleDetailCount(count);
- }
-
- public void setRowCount(int count) {
- mRowCount = count;
- mScript.set_rowCount(count);
- }
-
- public void setRowSpacing(float spacing) {
- mScript.set_rowSpacing(spacing);
- }
-
- public void setOverscrollSlots(float slots) {
- mScript.set_overscrollSlots(slots);
- }
-
- public void setFirstCardTop(boolean first) {
- mScript.set_firstCardTop(first);
- }
-
- public void setPrefetchCardCount(int count) {
- mPrefetchCardCount = count;
- mScript.set_prefetchCardCount(count);
- }
-
- public void setDetailTextureAlignment(int alignment) {
- mScript.set_detailTextureAlignment(alignment);
- }
-
- private void resizeProgramStoresCard(int count) {
- // enableResize works around a Renderscript bug that keeps resizes from being propagated.
- // TODO(jshuma): Remove enableResize once the Renderscript bug is fixed
- final boolean enableResize = false;
-
- if (mProgramStoresCard != null && enableResize) {
- int newSize = count > 0 ? count : 1;
- mProgramStoresCard.resize(newSize);
- } else {
- mProgramStoresCard = new ScriptField_ProgramStore_s(mRS, count > 0 ? count : 1);
- mScript.bind_programStoresCard(mProgramStoresCard);
- }
- }
-
- private void setProgramStoreCard(int n, ProgramStore programStore) {
- ScriptField_ProgramStore_s.Item item = mProgramStoresCard.get(n);
- if (item == null) {
- item = new ScriptField_ProgramStore_s.Item();
- }
- item.programStore = programStore;
- mProgramStoresCard.set(item, n, false);
- mScript.invoke_setProgramStoresCard(n, programStore);
- }
-
- public void setStoreConfigs(int configs[]) {
- if (configs == null) {
- initProgramStore();
- return;
- }
-
- final int count = configs.length;
-
- resizeProgramStoresCard(count);
- for (int i=0; i<count; ++i) {
- final int config = configs[i];
-
- final boolean alpha = (config & CarouselController.STORE_CONFIG_ALPHA) != 0;
- final boolean depthReads = (config & CarouselController.STORE_CONFIG_DEPTH_READS) != 0;
- final boolean depthWrites =
- (config & CarouselController.STORE_CONFIG_DEPTH_WRITES) != 0;
-
- final boolean dither = true;
- final ProgramStore.BlendDstFunc dstFunc = alpha ?
- ProgramStore.BlendDstFunc.ONE_MINUS_SRC_ALPHA :
- ProgramStore.BlendDstFunc.ZERO;
- final ProgramStore.DepthFunc depthFunc = depthReads ?
- ProgramStore.DepthFunc.LESS :
- ProgramStore.DepthFunc.ALWAYS;
-
- final ProgramStore ps = new ProgramStore.Builder(mRS)
- .setBlendFunc(ProgramStore.BlendSrcFunc.ONE, dstFunc)
- .setDitherEnabled(dither)
- .setDepthFunc(depthFunc)
- .setDepthMaskEnabled(depthWrites)
- .create();
-
- setProgramStoreCard(i, ps);
- }
- }
-
- /**
- * Sets whether the background texture and default card geometry are to be drawn with respect
- * to the depth buffer (both reading from it and writing to it).
- *
- * This method is a specialization of functionality that can be done with greater flexibility
- * by setStoreConfigs. Calling setForceBlendCardsWithZ() after calling setStoreConfigs()
- * results in the values set in setStoreConfigs() being discarded.
- *
- * @param enabled true to read from and write to the depth buffer, false to ignore it
- */
- public void setForceBlendCardsWithZ(boolean enabled) {
- mForceBlendCardsWithZ = enabled;
- initProgramStore();
- }
-
- public void setDrawRuler(boolean drawRuler) {
- mScript.set_drawRuler(drawRuler);
- }
-
- public void setDefaultBitmap(Bitmap bitmap)
- {
- mScript.set_defaultTexture(allocationFromBitmap(bitmap, MIPMAP));
- }
-
- public void setLoadingBitmap(Bitmap bitmap)
- {
- mScript.set_loadingTexture(allocationFromBitmap(bitmap, MIPMAP));
- }
-
- public void setDefaultGeometry(Mesh mesh)
- {
- mScript.set_defaultGeometry(mesh);
- }
-
- public void setLoadingGeometry(Mesh mesh)
- {
- mScript.set_loadingGeometry(mesh);
- }
-
- public void setStartAngle(float theta)
- {
- mScript.set_startAngle(theta);
- }
-
- public void setCarouselRotationAngle(float theta) {
- mScript.invoke_setCarouselRotationAngle(theta);
- }
-
- public void setCarouselRotationAngle(float endAngle, int milliseconds, int interpolationMode,
- float maxAnimatedArc) {
- mScript.invoke_setCarouselRotationAngle2(endAngle, milliseconds, interpolationMode,
- maxAnimatedArc);
- }
-
- public void setCallback(CarouselCallback callback)
- {
- mCallback = callback;
- }
-
- private Allocation allocationFromBitmap(Bitmap bitmap, Allocation.MipmapControl mipmap)
- {
- if (bitmap == null) return null;
- Allocation allocation = Allocation.createFromBitmap(mRS, bitmap,
- mipmap, Allocation.USAGE_GRAPHICS_TEXTURE);
- return allocation;
- }
-
- private Allocation allocationFromPool(int n, Bitmap bitmap, Allocation.MipmapControl mipmap)
- {
- int count = (mVisibleSlots + 2*mPrefetchCardCount) * mRowCount;
- if (mAllocationPool == null || mAllocationPool.length != count) {
- Allocation[] tmp = new Allocation[count];
- int oldsize = mAllocationPool == null ? 0 : mAllocationPool.length;
- for (int i = 0; i < Math.min(count, oldsize); i++) {
- tmp[i] = mAllocationPool[i];
- }
- mAllocationPool = tmp;
- }
- Allocation allocation = mAllocationPool[n % count];
- if (allocation == null) {
- allocation = allocationFromBitmap(bitmap, mipmap);
- mAllocationPool[n % count] = allocation;
- } else if (bitmap != null) {
- if (bitmap.getWidth() == allocation.getType().getX()
- && bitmap.getHeight() == allocation.getType().getY()) {
- allocation.copyFrom(bitmap);
- } else {
- Log.v(TAG, "Warning, bitmap has different size. Taking slow path");
- allocation = allocationFromBitmap(bitmap, mipmap);
- mAllocationPool[n % count] = allocation;
- }
- }
- return allocation;
- }
-
- private ScriptField_Card.Item getCard(int n) {
- ScriptField_Card.Item item;
- try {
- item = mCards.get(n);
- }
- catch (ArrayIndexOutOfBoundsException e) {
- if (DBG) Log.v(TAG, "getCard(): no item at index " + n);
- item = null;
- }
- return item;
- }
-
- private ScriptField_Card.Item getOrCreateCard(int n) {
- ScriptField_Card.Item item = getCard(n);
- if (item == null) {
- if (DBG) Log.v(TAG, "getOrCreateCard(): no item at index " + n + "; creating new");
- item = new ScriptField_Card.Item();
- }
- return item;
- }
-
- private void setCard(int n, ScriptField_Card.Item item) {
- try {
- mCards.set(item, n, false); // This is primarily used for reference counting.
- }
- catch (ArrayIndexOutOfBoundsException e) {
- // The specified index didn't exist. This can happen when a stale invalidate
- // request outlived an array resize request. Something might be getting dropped,
- // but there's not much we can do about this at this point to recover.
- Log.w(TAG, "setCard(" + n + "): Texture " + n + " doesn't exist");
- }
- }
-
- public void setTexture(int n, Bitmap bitmap)
- {
- if (n < 0) throw new IllegalArgumentException("Index cannot be negative");
-
- synchronized(this) {
- ScriptField_Card.Item item = getOrCreateCard(n);
- if (bitmap != null) {
- item.texture = allocationFromPool(n, bitmap, MIPMAP);
- } else {
- if (item.texture != null) {
- if (DBG) Log.v(TAG, "unloading texture " + n);
- item.texture = null;
- }
- }
- setCard(n, item);
- mScript.invoke_setTexture(n, item.texture);
- }
- }
-
- void setDetailTexture(int n, float offx, float offy, float loffx, float loffy, Bitmap bitmap)
- {
- if (n < 0) throw new IllegalArgumentException("Index cannot be negative");
-
- synchronized(this) {
- ScriptField_Card.Item item = getOrCreateCard(n);
- float width = 0.0f;
- float height = 0.0f;
- if (bitmap != null) {
- item.detailTexture = allocationFromBitmap(bitmap, MIPMAP);
- width = bitmap.getWidth();
- height = bitmap.getHeight();
- } else {
- if (item.detailTexture != null) {
- if (DBG) Log.v(TAG, "unloading detail texture " + n);
- // Don't wait for GC to free native memory.
- // Only works if textures are not shared.
- item.detailTexture.destroy();
- item.detailTexture = null;
- }
- }
- setCard(n, item);
- mScript.invoke_setDetailTexture(n, offx, offy, loffx, loffy, item.detailTexture);
- }
- }
-
- void invalidateTexture(int n, boolean eraseCurrent)
- {
- if (n < 0) throw new IllegalArgumentException("Index cannot be negative");
-
- synchronized(this) {
- ScriptField_Card.Item item = getCard(n);
- if (item == null) {
- // This card was never created, so there's nothing to invalidate.
- return;
- }
- if (eraseCurrent && item.texture != null) {
- if (DBG) Log.v(TAG, "unloading texture " + n);
- // Don't wait for GC to free native memory.
- // Only works if textures are not shared.
- item.texture.destroy();
- item.texture = null;
- }
- setCard(n, item);
- mScript.invoke_invalidateTexture(n, eraseCurrent);
- }
- }
-
- void invalidateDetailTexture(int n, boolean eraseCurrent)
- {
- if (n < 0) throw new IllegalArgumentException("Index cannot be negative");
-
- synchronized(this) {
- ScriptField_Card.Item item = getCard(n);
- if (item == null) {
- // This card was never created, so there's nothing to invalidate.
- return;
- }
- if (eraseCurrent && item.detailTexture != null) {
- if (DBG) Log.v(TAG, "unloading detail texture " + n);
- // Don't wait for GC to free native memory.
- // Only works if textures are not shared.
- item.detailTexture.destroy();
- item.detailTexture = null;
- }
- setCard(n, item);
- mScript.invoke_invalidateDetailTexture(n, eraseCurrent);
- }
- }
-
- public void setGeometry(int n, Mesh geometry)
- {
- if (n < 0) throw new IllegalArgumentException("Index cannot be negative");
-
- synchronized(this) {
- final boolean mipmap = false;
- ScriptField_Card.Item item = getOrCreateCard(n);
- if (geometry != null) {
- item.geometry = geometry;
- } else {
- if (DBG) Log.v(TAG, "unloading geometry " + n);
- if (item.geometry != null) {
- // item.geometry.destroy();
- item.geometry = null;
- }
- }
- setCard(n, item);
- mScript.invoke_setGeometry(n, item.geometry);
- }
- }
-
- public void setMatrix(int n, float[] matrix) {
- if (n < 0) throw new IllegalArgumentException("Index cannot be negative");
-
- synchronized(this) {
- final boolean mipmap = false;
- ScriptField_Card.Item item = getOrCreateCard(n);
- if (matrix != null) {
- item.matrix = matrixFromFloat(matrix);
- } else {
- if (DBG) Log.v(TAG, "unloading matrix " + n);
- item.matrix = null;
- }
- setCard(n, item);
- mScript.invoke_setMatrix(n, item.matrix);
- }
- }
-
- public void setBackgroundColor(Float4 color) {
- mScript.set_backgroundColor(color);
- }
-
- public void setBackgroundTexture(Bitmap bitmap) {
- Allocation texture = null;
- if (bitmap != null) {
- texture = Allocation.createFromBitmap(mRS, bitmap,
- MIPMAP, Allocation.USAGE_GRAPHICS_TEXTURE);
- }
- mScript.set_backgroundTexture(texture);
- }
-
- public void setDetailLineTexture(Bitmap bitmap) {
- Allocation texture = null;
- if (bitmap != null) {
- texture = Allocation.createFromBitmap(mRS, bitmap,
- MIPMAP, Allocation.USAGE_GRAPHICS_TEXTURE);
- }
- mScript.set_detailLineTexture(texture);
- }
-
- public void setDetailLoadingTexture(Bitmap bitmap) {
- Allocation texture = null;
- if (bitmap != null) {
- texture = Allocation.createFromBitmap(mRS, bitmap,
- MIPMAP, Allocation.USAGE_GRAPHICS_TEXTURE);
- }
- mScript.set_detailLoadingTexture(texture);
- }
-
- public void pauseRendering() {
- // Used to update multiple states at once w/o redrawing for each.
- mRS.bindRootScript(null);
- }
-
- public void resumeRendering() {
- mRS.bindRootScript(mScript);
- }
-
- public void doLongPress() {
- mScript.invoke_doLongPress();
- }
-
- public void doMotion(float x, float y, long t) {
- mScript.invoke_doMotion(x, y, t);
- }
-
- public void doStart(float x, float y, long t) {
- mScript.invoke_doStart(x, y, t);
- }
-
- public void doStop(float x, float y, long t) {
- mScript.invoke_doStop(x, y, t);
- }
-
- public void setSlotCount(int n) {
- mScript.set_slotCount(n);
- }
-
- public void setRezInCardCount(float alpha) {
- mScript.set_rezInCardCount(alpha);
- }
-
- public void setFadeInDuration(long t) {
- mScript.set_fadeInDuration((int)t); // TODO: Remove cast when RS supports exporting longs
- }
-
- public void setCardCreationFadeDuration(long t) {
- mScript.set_cardCreationFadeDuration((int)t);
- }
-
- private Element elementForBitmap(Bitmap bitmap, Bitmap.Config defaultConfig) {
- Bitmap.Config config = bitmap.getConfig();
- if (config == null) {
- config = defaultConfig;
- }
- if (config == Bitmap.Config.ALPHA_8) {
- return A_8(mRS);
- } else if (config == Bitmap.Config.RGB_565) {
- return RGB_565(mRS);
- } else if (config == Bitmap.Config.ARGB_4444) {
- return RGBA_4444(mRS);
- } else if (config == Bitmap.Config.ARGB_8888) {
- return RGBA_8888(mRS);
- } else {
- throw new IllegalArgumentException("Unknown configuration");
- }
- }
-
- public Mesh loadGeometry(int resId) {
- if (resId == 0) {
- return null;
- }
- FileA3D model = FileA3D.createFromResource(mRS, mRes, resId);
- if (model == null) {
- return null;
- }
- FileA3D.IndexEntry entry = model.getIndexEntry(0);
- if(entry == null || entry.getEntryType() != FileA3D.EntryType.MESH) {
- return null;
- }
- return (Mesh) entry.getObject();
- }
-}