diff options
| -rw-r--r-- | libs/rs/Android.mk | 1 | ||||
| -rw-r--r-- | libs/rs/RenderScript.h | 16 | ||||
| -rw-r--r-- | libs/rs/java/Fountain/res/raw/fountain.c | 8 | ||||
| -rw-r--r-- | libs/rs/java/Fountain/src/com/android/fountain/RenderScript.java | 67 | ||||
| -rw-r--r-- | libs/rs/jni/RenderScript_jni.cpp | 56 | ||||
| -rw-r--r-- | libs/rs/rsUtils.h | 4 |
6 files changed, 75 insertions, 77 deletions
diff --git a/libs/rs/Android.mk b/libs/rs/Android.mk index 6f72802..6ff39a4 100644 --- a/libs/rs/Android.mk +++ b/libs/rs/Android.mk @@ -117,6 +117,7 @@ LOCAL_SHARED_LIBRARIES := \ libnativehelper \ libRS \ libcutils \ + libsgl \ libutils \ libui diff --git a/libs/rs/RenderScript.h b/libs/rs/RenderScript.h index 378fccc..2b33419 100644 --- a/libs/rs/RenderScript.h +++ b/libs/rs/RenderScript.h @@ -86,14 +86,14 @@ enum RsElementPredefined { RS_ELEMENT_USER_I32, RS_ELEMENT_USER_FLOAT, - RS_ELEMENT_A_8, - RS_ELEMENT_RGB_565, - RS_ELEMENT_RGBA_5551, - RS_ELEMENT_RGBA_4444, - RS_ELEMENT_RGB_888, - RS_ELEMENT_RGBA_8888, - - RS_ELEMENT_INDEX_16, + RS_ELEMENT_A_8, // 7 + RS_ELEMENT_RGB_565, // 8 + RS_ELEMENT_RGBA_5551, // 9 + RS_ELEMENT_RGBA_4444, // 10 + RS_ELEMENT_RGB_888, // 11 + RS_ELEMENT_RGBA_8888, // 12 + + RS_ELEMENT_INDEX_16, //13 RS_ELEMENT_INDEX_32, RS_ELEMENT_XY_F32, RS_ELEMENT_XYZ_F32, diff --git a/libs/rs/java/Fountain/res/raw/fountain.c b/libs/rs/java/Fountain/res/raw/fountain.c index 76f8dcf..cee6e22 100644 --- a/libs/rs/java/Fountain/res/raw/fountain.c +++ b/libs/rs/java/Fountain/res/raw/fountain.c @@ -15,7 +15,7 @@ main(con, ft, launchID) { count = loadI32(con, 0, 1); touch = loadI32(con, 0, 2); x = loadI32(con, 0, 3); - y = 480 - loadI32(con, 0, 4); + y = loadI32(con, 0, 4); rate = 4; maxLife = (count / rate) - 1; @@ -69,7 +69,7 @@ main(con, ft, launchID) { posy = * (int* )(partPtr + 16); //loadEnvI32(con, 2, srcIdx + 4); if (life) { - if (posy > 0) { + if (posy < (480 << 16)) { c = 0xffafcf | ((life >> lifeShift) << 24); * (int* )(vertPtr) = c; //storeEnvU32(con, 1, dstIdx, c); @@ -87,14 +87,14 @@ main(con, ft, launchID) { vertPtr = vertPtr + 36; drawCount ++; } else { - if (dy < 0) { + if (dy > 0) { dy = (-dy) >> 1; } } posx = posx + dx; posy = posy + dy; - dy = dy - 0x400; + dy = dy + 0x400; life --; * (int* )(partPtr + 0) = dx; //storeEnvI32(con, 2, srcIdx, dx); diff --git a/libs/rs/java/Fountain/src/com/android/fountain/RenderScript.java b/libs/rs/java/Fountain/src/com/android/fountain/RenderScript.java index cf16cec..796fe35 100644 --- a/libs/rs/java/Fountain/src/com/android/fountain/RenderScript.java +++ b/libs/rs/java/Fountain/src/com/android/fountain/RenderScript.java @@ -83,9 +83,8 @@ public class RenderScript { native private int nAllocationCreateTyped(int type); native private int nAllocationCreatePredefSized(int predef, int count); native private int nAllocationCreateSized(int elem, int count); - native private int nAllocationCreateFromBitmap(int w, int h, int dstFmt, int srcFmt, boolean genMips, int[] data); + native private int nAllocationCreateFromBitmap(int dstFmt, boolean genMips, Bitmap bmp); - //native private int nAllocationCreateFromBitmap(type.mID); native private void nAllocationUploadToTexture(int alloc, int baseMioLevel); native private void nAllocationDestroy(int alloc); native private void nAllocationData(int id, int[] d); @@ -190,21 +189,19 @@ public class RenderScript { USER_I32 (5), USER_FLOAT (6), - A_8 (7), - RGB_565 (8), - RGBA_5551 (9), - RGBA_4444 (10), - RGB_888 (11), - RGBA_8888 (12), - - INDEX_16 (13), - INDEX_32 (14), - XY_F32 (15), - XYZ_F32 (16), - ST_XY_F32 (17), - ST_XYZ_F32 (18), - NORM_XYZ_F32 (19), - NORM_ST_XYZ_F32 (20); + A_8 (7), + RGB_565 (8), + RGB_888 (12), + RGBA_5551 (9), + RGBA_4444 (10), + RGBA_8888 (13), + + INDEX_16 (16), + INDEX_32 (17), + XY_F32 (18), + XYZ_F32 (19), + ST_XY_F32 (20), + ST_XYZ_F32 (21); int mID; ElementPredefined(int id) { @@ -475,41 +472,7 @@ public class RenderScript { } public Allocation allocationCreateFromBitmap(Bitmap b, ElementPredefined dstFmt, boolean genMips) { - int w = b.getWidth(); - int h = b.getHeight(); - int[] data = new int[w * h]; - - int outPtr = 0; - for(int y=0; y < h; y++) { - for(int x=0; x < w; x++) { - data[outPtr] = b.getPixel(x, y); - outPtr++; - } - } - - int srcFmt = 0; - /* - switch(b.getConfig()) { - case ALPHA_8: - srcFmt = ElementPredefined.A_8.mID; - break; - case ARGB_4444: - srcFmt = ElementPredefined.RGBA_4444.mID; - break; - case ARGB_8888: - srcFmt = ElementPredefined.RGBA_8888.mID; - break; - case RGB_565: - srcFmt = ElementPredefined.RGB_565.mID; - break; - default: - Log.e(LOG_TAG, "allocationCreateFromBitmap, unknown bitmap format"); - } - */ - - srcFmt = ElementPredefined.RGBA_8888.mID; - - int id = nAllocationCreateFromBitmap(w, h, dstFmt.mID, srcFmt, genMips, data); + int id = nAllocationCreateFromBitmap(dstFmt.mID, genMips, b); return new Allocation(id); } diff --git a/libs/rs/jni/RenderScript_jni.cpp b/libs/rs/jni/RenderScript_jni.cpp index 4af58a6..61866b7 100644 --- a/libs/rs/jni/RenderScript_jni.cpp +++ b/libs/rs/jni/RenderScript_jni.cpp @@ -26,6 +26,8 @@ #include <ui/EGLNativeWindowSurface.h> #include <ui/Surface.h> +#include <core/SkBitmap.h> + #include "jni.h" #include "JNIHelp.h" #include "android_runtime/AndroidRuntime.h" @@ -48,12 +50,15 @@ static void doThrow(JNIEnv* env, const char* exc, const char* msg = NULL) env->ThrowNew(npeClazz, msg); } -static jfieldID gContextId; +static jfieldID gContextId = 0; +static jfieldID gNativeBitmapID = 0; static void _nInit(JNIEnv *_env, jclass _this) { - LOGE("_nInit"); gContextId = _env->GetFieldID(_this, "mContext", "I"); + + jclass bitmapClass = _env->FindClass("android/graphics/Bitmap"); + gNativeBitmapID = _env->GetFieldID(bitmapClass, "mNativeBitmap", "I"); } @@ -218,19 +223,48 @@ nAllocationUploadToTexture(JNIEnv *_env, jobject _this, jint a, jint mip) rsAllocationUploadToTexture((RsAllocation)a, mip); } +static RsElementPredefined SkBitmapToPredefined(SkBitmap::Config cfg) +{ + switch (cfg) { + case SkBitmap::kA8_Config: + return RS_ELEMENT_A_8; + case SkBitmap::kARGB_4444_Config: + return RS_ELEMENT_RGBA_4444; + case SkBitmap::kARGB_8888_Config: + return RS_ELEMENT_RGBA_8888; + case SkBitmap::kRGB_565_Config: + return RS_ELEMENT_RGB_565; + + default: + break; + } + // If we don't have a conversion mark it as a user type. + LOGE("Unsupported bitmap type"); + return RS_ELEMENT_USER_U8; +} + static int -nAllocationCreateFromBitmap(JNIEnv *_env, jobject _this, jint w, jint h, jint dstFmt, jint srcFmt, jboolean genMips, jintArray data) +nAllocationCreateFromBitmap(JNIEnv *_env, jobject _this, jint dstFmt, jboolean genMips, jobject jbitmap) { RsContext con = (RsContext)(_env->GetIntField(_this, gContextId)); - jint len = _env->GetArrayLength(data); - LOG_API("nAllocationCreateFromBitmap, con(%p), w(%i), h(%i), dstFmt(%i), srcFmt(%i), mip(%i), len(%i)", con, w, h, dstFmt, srcFmt, genMips, len); + SkBitmap const * nativeBitmap = + (SkBitmap const *)_env->GetIntField(jbitmap, gNativeBitmapID); + const SkBitmap& bitmap(*nativeBitmap); + SkBitmap::Config config = bitmap.getConfig(); - jint *ptr = _env->GetIntArrayElements(data, NULL); - jint id = (jint)rsAllocationCreateFromBitmap(w, h, (RsElementPredefined)dstFmt, (RsElementPredefined)srcFmt, genMips, ptr); - _env->ReleaseIntArrayElements(data, ptr, JNI_ABORT); - return id; -} + RsElementPredefined e = SkBitmapToPredefined(config); + if (e != RS_ELEMENT_USER_U8) { + bitmap.lockPixels(); + const int w = bitmap.width(); + const int h = bitmap.height(); + const void* ptr = bitmap.getPixels(); + jint id = (jint)rsAllocationCreateFromBitmap(w, h, (RsElementPredefined)dstFmt, e, genMips, ptr); + bitmap.unlockPixels(); + return id; + } + return 0; +} static void @@ -795,7 +829,7 @@ static JNINativeMethod methods[] = { {"nAllocationCreateTyped", "(I)I", (void*)nAllocationCreateTyped }, {"nAllocationCreatePredefSized", "(II)I", (void*)nAllocationCreatePredefSized }, {"nAllocationCreateSized", "(II)I", (void*)nAllocationCreateSized }, -{"nAllocationCreateFromBitmap", "(IIIIZ[I)I", (void*)nAllocationCreateFromBitmap }, +{"nAllocationCreateFromBitmap", "(IZLandroid/graphics/Bitmap;)I", (void*)nAllocationCreateFromBitmap }, {"nAllocationUploadToTexture", "(II)V", (void*)nAllocationUploadToTexture }, {"nAllocationDestroy", "(I)V", (void*)nAllocationDestroy }, {"nAllocationData", "(I[I)V", (void*)nAllocationData_i }, diff --git a/libs/rs/rsUtils.h b/libs/rs/rsUtils.h index 683c96e..f40e2ce 100644 --- a/libs/rs/rsUtils.h +++ b/libs/rs/rsUtils.h @@ -87,9 +87,9 @@ T rsLowerPow2(T v) static inline uint16_t rs888to565(uint32_t r, uint32_t g, uint32_t b) { uint16_t t = 0; - t |= r >> 3; + t |= b >> 3; t |= (g >> 2) << 5; - t |= (b >> 3) << 11; + t |= (r >> 3) << 11; return t; } |
