diff --git a/core/jni/Android.mk b/core/jni/Android.mk index 07597a05be173..726b2f7f32362 100644 --- a/core/jni/Android.mk +++ b/core/jni/Android.mk @@ -100,7 +100,6 @@ LOCAL_SRC_FILES:= \ android/graphics/Graphics.cpp \ android/graphics/HarfBuzzNGFaceSkia.cpp \ android/graphics/Interpolator.cpp \ - android/graphics/LayerRasterizer.cpp \ android/graphics/MaskFilter.cpp \ android/graphics/Matrix.cpp \ android/graphics/Movie.cpp \ diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp index 767439ade5860..f41af04583f9a 100644 --- a/core/jni/AndroidRuntime.cpp +++ b/core/jni/AndroidRuntime.cpp @@ -56,7 +56,6 @@ extern int register_android_graphics_Camera(JNIEnv* env); extern int register_android_graphics_CreateJavaOutputStreamAdaptor(JNIEnv* env); extern int register_android_graphics_Graphics(JNIEnv* env); extern int register_android_graphics_Interpolator(JNIEnv* env); -extern int register_android_graphics_LayerRasterizer(JNIEnv*); extern int register_android_graphics_MaskFilter(JNIEnv* env); extern int register_android_graphics_Movie(JNIEnv* env); extern int register_android_graphics_NinePatch(JNIEnv*); @@ -109,6 +108,7 @@ extern int register_android_graphics_CanvasProperty(JNIEnv* env); extern int register_android_graphics_ColorFilter(JNIEnv* env); extern int register_android_graphics_DrawFilter(JNIEnv* env); extern int register_android_graphics_FontFamily(JNIEnv* env); +extern int register_android_graphics_LayerRasterizer(JNIEnv*); extern int register_android_graphics_Matrix(JNIEnv* env); extern int register_android_graphics_Paint(JNIEnv* env); extern int register_android_graphics_Path(JNIEnv* env); diff --git a/core/jni/android/graphics/GraphicsJNI.h b/core/jni/android/graphics/GraphicsJNI.h index 4c423416d9f09..db7b6d9f39aef 100644 --- a/core/jni/android/graphics/GraphicsJNI.h +++ b/core/jni/android/graphics/GraphicsJNI.h @@ -52,6 +52,10 @@ public: static SkPicture* getNativePicture(JNIEnv*, jobject picture); static SkRegion* getNativeRegion(JNIEnv*, jobject region); + // Given the 'native' long held by the Rasterizer.java object, return a + // ref to its SkRasterizer* (or NULL). + static SkRasterizer* refNativeRasterizer(jlong rasterizerHandle); + /** Return the corresponding native config from the java Config enum, or kNo_Config if the java object is null. */ diff --git a/core/jni/android/graphics/LayerRasterizer.cpp b/core/jni/android/graphics/LayerRasterizer.cpp deleted file mode 100644 index 79dc275071382..0000000000000 --- a/core/jni/android/graphics/LayerRasterizer.cpp +++ /dev/null @@ -1,34 +0,0 @@ -#include "SkLayerRasterizer.h" -#include - -class SkLayerRasterizerGlue { -public: - static jlong create(JNIEnv* env, jobject) { - return reinterpret_cast(new SkLayerRasterizer()); - } - - static void addLayer(JNIEnv* env, jobject, jlong layerHandle, jlong paintHandle, jfloat dx, jfloat dy) { - SkLayerRasterizer* layer = reinterpret_cast(layerHandle); - const SkPaint* paint = reinterpret_cast(paintHandle); - SkASSERT(layer); - SkASSERT(paint); - layer->addLayer(*paint, dx, dy); - } -}; - -///////////////////////////////////////////////////////////////////////////////////////// - -#include - -static JNINativeMethod gLayerRasterizerMethods[] = { - { "nativeConstructor", "()J", (void*)SkLayerRasterizerGlue::create }, - { "nativeAddLayer", "(JJFF)V", (void*)SkLayerRasterizerGlue::addLayer } -}; - -int register_android_graphics_LayerRasterizer(JNIEnv* env) -{ - return android::AndroidRuntime::registerNativeMethods(env, - "android/graphics/LayerRasterizer", - gLayerRasterizerMethods, - SK_ARRAY_COUNT(gLayerRasterizerMethods)); -} diff --git a/core/jni/android/graphics/Paint.cpp b/core/jni/android/graphics/Paint.cpp index b0d5485dab44a..43e80dcb2f357 100644 --- a/core/jni/android/graphics/Paint.cpp +++ b/core/jni/android/graphics/Paint.cpp @@ -106,16 +106,33 @@ public: *dst = *src; } + // Equivalent to the Java Paint's FILTER_BITMAP_FLAG. + static const uint32_t sFilterBitmapFlag = 0x02; + static jint getFlags(JNIEnv* env, jobject paint) { NPE_CHECK_RETURN_ZERO(env, paint); - int result; - result = GraphicsJNI::getNativePaint(env, paint)->getFlags(); + SkPaint* nativePaint = GraphicsJNI::getNativePaint(env, paint); + uint32_t result = nativePaint->getFlags(); + result &= ~sFilterBitmapFlag; // Filtering no longer stored in this bit. Mask away. + if (nativePaint->getFilterLevel() != SkPaint::kNone_FilterLevel) { + result |= sFilterBitmapFlag; + } return static_cast(result); } static void setFlags(JNIEnv* env, jobject paint, jint flags) { NPE_CHECK_RETURN_VOID(env, paint); - GraphicsJNI::getNativePaint(env, paint)->setFlags(flags); + SkPaint* nativePaint = GraphicsJNI::getNativePaint(env, paint); + // Instead of modifying 0x02, change the filter level. + nativePaint->setFilterLevel(flags & sFilterBitmapFlag + ? SkPaint::kLow_FilterLevel + : SkPaint::kNone_FilterLevel); + // Don't pass through filter flag, which is no longer stored in paint's flags. + flags &= ~sFilterBitmapFlag; + // Use the existing value for 0x02. + const uint32_t existing0x02Flag = nativePaint->getFlags() & sFilterBitmapFlag; + flags |= existing0x02Flag; + nativePaint->setFlags(flags); } static jint getHinting(JNIEnv* env, jobject paint) { @@ -298,7 +315,7 @@ public: static jlong setRasterizer(JNIEnv* env, jobject clazz, jlong objHandle, jlong rasterizerHandle) { SkPaint* obj = reinterpret_cast(objHandle); - SkRasterizer* rasterizer = reinterpret_cast(rasterizerHandle); + SkAutoTUnref rasterizer(GraphicsJNI::refNativeRasterizer(rasterizerHandle)); return reinterpret_cast(obj->setRasterizer(rasterizer)); } diff --git a/core/jni/android/graphics/Rasterizer.cpp b/core/jni/android/graphics/Rasterizer.cpp index b6450d03ba1e7..a05d19b4740a0 100644 --- a/core/jni/android/graphics/Rasterizer.cpp +++ b/core/jni/android/graphics/Rasterizer.cpp @@ -22,30 +22,82 @@ #include "jni.h" #include "GraphicsJNI.h" +#include "SkLayerRasterizer.h" #include -#include "SkRasterizer.h" +// Rasterizer.java holds a pointer (jlong) to this guy +class NativeRasterizer { +public: + NativeRasterizer() {} + virtual ~NativeRasterizer() {} + + // Can return NULL, or a ref to the skia rasterizer. + virtual SkRasterizer* refRasterizer() { return NULL; } +}; + +class NativeLayerRasterizer : public NativeRasterizer { +public: + SkLayerRasterizer::Builder fBuilder; + + virtual SkRasterizer* refRasterizer() { + return fBuilder.snapshotRasterizer(); + } +}; + +SkRasterizer* GraphicsJNI::refNativeRasterizer(jlong rasterizerHandle) { + NativeRasterizer* nr = reinterpret_cast(rasterizerHandle); + return nr ? nr->refRasterizer() : NULL; +} + +/////////////////////////////////////////////////////////////////////////////// namespace android { class SkRasterizerGlue { public: - static void finalizer(JNIEnv* env, jobject clazz, jlong objHandle) { - SkRasterizer* obj = reinterpret_cast(objHandle); - SkSafeUnref(obj); + delete reinterpret_cast(objHandle); } }; -static JNINativeMethod methods[] = { +static JNINativeMethod gRasterizerMethods[] = { {"finalizer", "(J)V", (void*) SkRasterizerGlue::finalizer} }; int register_android_graphics_Rasterizer(JNIEnv* env) { - int result = AndroidRuntime::registerNativeMethods(env, "android/graphics/Rasterizer", methods, - sizeof(methods) / sizeof(methods[0])); + int result = AndroidRuntime::registerNativeMethods(env, "android/graphics/Rasterizer", gRasterizerMethods, + sizeof(gRasterizerMethods) / sizeof(gRasterizerMethods[0])); return result; } +class SkLayerRasterizerGlue { +public: + static jlong create(JNIEnv* env, jobject) { + return reinterpret_cast(new NativeLayerRasterizer); + } + + static void addLayer(JNIEnv* env, jobject, jlong layerHandle, jlong paintHandle, jfloat dx, jfloat dy) { + NativeLayerRasterizer* nr = reinterpret_cast(layerHandle); + const SkPaint* paint = reinterpret_cast(paintHandle); + SkASSERT(nr); + SkASSERT(paint); + nr->fBuilder.addLayer(*paint, dx, dy); + } +}; + +static JNINativeMethod gLayerRasterizerMethods[] = { + { "nativeConstructor", "()J", (void*)SkLayerRasterizerGlue::create }, + { "nativeAddLayer", "(JJFF)V", (void*)SkLayerRasterizerGlue::addLayer } +}; + +int register_android_graphics_LayerRasterizer(JNIEnv* env) +{ + return android::AndroidRuntime::registerNativeMethods(env, + "android/graphics/LayerRasterizer", + gLayerRasterizerMethods, + SK_ARRAY_COUNT(gLayerRasterizerMethods)); } + +} +