OSDN Git Service

Revert "Refactor setting an SkPaint onto a hwui Layer."
authorDerek Sollenberger <djsollen@google.com>
Wed, 12 Feb 2014 18:59:05 +0000 (18:59 +0000)
committerDerek Sollenberger <djsollen@google.com>
Wed, 12 Feb 2014 18:59:05 +0000 (18:59 +0000)
This reverts commit e889298cd6ae1fc0d76bc00d7d12586db03eb261.

Change-Id: I4b1d609b2d4280595d40cb10d6c18875c22999f8

core/java/android/view/HardwareLayer.java
core/jni/android_view_HardwareLayer.cpp
libs/hwui/DeferredLayerUpdater.cpp
libs/hwui/DeferredLayerUpdater.h
libs/hwui/Layer.cpp
libs/hwui/Layer.h
libs/hwui/OpenGLRenderer.cpp

index cb63c09..9bbcf7c 100644 (file)
@@ -66,7 +66,8 @@ final class HardwareLayer {
      * @see View#setLayerPaint(android.graphics.Paint)
      */
     public void setLayerPaint(Paint paint) {
-        nSetLayerPaint(mFinalizer.mDeferredUpdater, paint.mNativePaint);
+        nSetLayerPaint(mFinalizer.mDeferredUpdater, paint.mNativePaint,
+                paint.getColorFilter() != null ? paint.getColorFilter().native_instance : 0);
     }
 
     /**
@@ -249,7 +250,7 @@ final class HardwareLayer {
     private static native void nDestroyLayerUpdater(long layerUpdater);
 
     private static native boolean nPrepare(long layerUpdater, int width, int height, boolean isOpaque);
-    private static native void nSetLayerPaint(long layerUpdater, long paint);
+    private static native void nSetLayerPaint(long layerUpdater, long paint, long colorFilter);
     private static native void nSetTransform(long layerUpdater, long matrix);
     private static native void nSetSurfaceTexture(long layerUpdater,
             SurfaceTexture surface, boolean isAlreadyAttached);
index 5b21e94..8a0a011 100644 (file)
@@ -88,11 +88,13 @@ static jboolean android_view_HardwareLayer_prepare(JNIEnv* env, jobject clazz,
 }
 
 static void android_view_HardwareLayer_setLayerPaint(JNIEnv* env, jobject clazz,
-        jlong layerUpdaterPtr, jlong paintPtr) {
+        jlong layerUpdaterPtr, jlong paintPtr, jlong colorFilterPtr) {
     DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerUpdaterPtr);
     if (layer) {
         SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
+        SkColorFilter* colorFilter = reinterpret_cast<SkColorFilter*>(colorFilterPtr);
         layer->setPaint(paint);
+        layer->setColorFilter(colorFilter);
     }
 }
 
@@ -160,7 +162,7 @@ static JNINativeMethod gMethods[] = {
     { "nDestroyLayerUpdater",    "(J)V",       (void*) android_view_HardwareLayer_destroyLayerUpdater },
 
     { "nPrepare",                "(JIIZ)Z",    (void*) android_view_HardwareLayer_prepare },
-    { "nSetLayerPaint",          "(JJ)V",      (void*) android_view_HardwareLayer_setLayerPaint },
+    { "nSetLayerPaint",          "(JJJ)V",     (void*) android_view_HardwareLayer_setLayerPaint },
     { "nSetTransform",           "(JJ)V",      (void*) android_view_HardwareLayer_setTransform },
     { "nSetSurfaceTexture",      "(JLandroid/graphics/SurfaceTexture;Z)V",
             (void*) android_view_HardwareLayer_setSurfaceTexture },
index 03bbaf0..ed05d04 100644 (file)
@@ -32,26 +32,24 @@ DeferredLayerUpdater::DeferredLayerUpdater(Layer* layer, OpenGLRenderer* rendere
         , mRenderer(renderer)
         , mCaches(Caches::getInstance()) {
     mCaches.resourceCache.incrementRefcount(mLayer);
-    SkRefCnt_SafeAssign(mColorFilter, mLayer->getColorFilter());
     mWidth = mLayer->layer.getWidth();
     mHeight = mLayer->layer.getHeight();
     mBlend = mLayer->isBlend();
+    mColorFilter = mLayer->getColorFilter();
     mAlpha = mLayer->getAlpha();
     mMode = mLayer->getMode();
     mDirtyRect.setEmpty();
 }
 
 DeferredLayerUpdater::~DeferredLayerUpdater() {
-    SkSafeUnref(mColorFilter);
+    setColorFilter(NULL);
     if (mLayer) {
         mCaches.resourceCache.decrementRefcount(mLayer);
     }
     delete mRenderer;
 }
 
-void DeferredLayerUpdater::setPaint(const SkPaint* paint) {
-    OpenGLRenderer::getAlphaAndModeDirect(paint, &mAlpha, &mMode);
-    SkColorFilter* colorFilter = (paint) ? paint->getColorFilter() : NULL;
+void DeferredLayerUpdater::setColorFilter(SkColorFilter* colorFilter) {
     SkRefCnt_SafeAssign(mColorFilter, colorFilter);
 }
 
@@ -138,10 +136,9 @@ void DeferredLayerUpdater::applyDeferred(DeferredLayerUpdater* deferredApply) {
     deferredApply->mSurfaceTexture = mSurfaceTexture;
     deferredApply->mNeedsGLContextAttach = mNeedsGLContextAttach;
     deferredApply->mUpdateTexImage = mUpdateTexImage;
+    deferredApply->setColorFilter(mColorFilter);
     deferredApply->setTransform(mTransform);
 
-    SkRefCnt_SafeAssign(deferredApply->mColorFilter, mColorFilter);
-
     mDisplayList = 0;
     mDirtyRect.setEmpty();
     mTransform = 0;
index 2735b9e..0350eef 100644 (file)
@@ -73,7 +73,11 @@ public:
     ANDROID_API void setDisplayList(DisplayList* displayList,
                 int left, int top, int right, int bottom);
 
-    ANDROID_API void setPaint(const SkPaint* paint);
+    ANDROID_API void setPaint(const SkPaint* paint) {
+        OpenGLRenderer::getAlphaAndModeDirect(paint, &mAlpha, &mMode);
+    }
+
+    ANDROID_API void setColorFilter(SkColorFilter* colorFilter);
 
     ANDROID_API bool apply();
     ANDROID_API void applyDeferred(DeferredLayerUpdater* deferredApply);
index 54ce64f..70eeb39 100644 (file)
@@ -131,9 +131,8 @@ void Layer::removeFbo(bool flush) {
     }
 }
 
-void Layer::setPaint(const SkPaint* paint) {
+void Layer::setPaint(SkPaint* paint) {
     OpenGLRenderer::getAlphaAndModeDirect(paint, &alpha, &mode);
-    setColorFilter((paint) ? paint->getColorFilter() : NULL);
 }
 
 void Layer::setColorFilter(SkColorFilter* filter) {
index 8cc027a..ec80e9c 100644 (file)
@@ -117,7 +117,7 @@ public:
         texture.height = height;
     }
 
-    ANDROID_API void setPaint(const SkPaint* paint);
+    ANDROID_API void setPaint(SkPaint* paint);
 
     inline void setBlend(bool blend) {
         texture.blend = blend;
index 0a83332..fee916b 100644 (file)
@@ -868,11 +868,14 @@ bool OpenGLRenderer::createLayer(float left, float top, float right, float botto
 
     const bool fboLayer = flags & SkCanvas::kClipToLayer_SaveFlag;
 
+    SkXfermode::Mode mode = getXfermodeDirect(paint);
+    int alpha = getAlphaDirect(paint);
+
     // Window coordinates of the layer
     Rect clip;
     Rect bounds(left, top, right, bottom);
     calculateLayerBoundsAndClip(bounds, clip, fboLayer);
-    updateSnapshotIgnoreForLayer(bounds, clip, fboLayer, getAlphaDirect(paint));
+    updateSnapshotIgnoreForLayer(bounds, clip, fboLayer, alpha);
 
     // Bail out if we won't draw in this snapshot
     if (currentSnapshot()->isIgnored()) {
@@ -885,11 +888,12 @@ bool OpenGLRenderer::createLayer(float left, float top, float right, float botto
         return false;
     }
 
-    layer->setPaint(paint);
+    layer->setAlpha(alpha, mode);
     layer->layer.set(bounds);
     layer->texCoords.set(0.0f, bounds.getHeight() / float(layer->getHeight()),
             bounds.getWidth() / float(layer->getWidth()), 0.0f);
 
+    layer->setColorFilter(getColorFilter(paint));
     layer->setBlend(true);
     layer->setDirty(false);
 
@@ -1007,6 +1011,7 @@ void OpenGLRenderer::composeLayer(const Snapshot& removed, const Snapshot& resto
     }
 
     if (!fboLayer && layer->getAlpha() < 255) {
+        // TODO: this seems to point to the fact that the layer should store the paint
         SkPaint layerPaint;
         layerPaint.setAlpha(layer->getAlpha());
         layerPaint.setXfermodeMode(SkXfermode::kDstIn_Mode);