Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ccc956b2 authored by Rob Tsuk's avatar Rob Tsuk Committed by Android Git Automerger
Browse files

am 41a8043b: Merge "Add a way to override Xfermode DO NOT MERGE" into lmp-mr1-dev

* commit '41a8043b':
  Add a way to override Xfermode DO NOT MERGE
parents dfb25b3d 41a8043b
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -994,4 +994,15 @@ class GLES20Canvas extends HardwareCanvas {
            int indexOffset, int indexCount, Paint paint) {
        // TODO: Implement
    }

    @Override
    public void setOverrideXfermode(PorterDuff.Mode xfermode) {
        int xfermodeValue = -1;
        if (xfermode != null) {
            xfermodeValue = xfermode.nativeInt;
        }
        nSetOverrideXfermode(mRenderer, xfermodeValue);
    }

    private static native void nSetOverrideXfermode(long renderer, int xfermode);
}
+8 −0
Original line number Diff line number Diff line
@@ -172,6 +172,12 @@ static jint android_view_GLES20Canvas_getMaxTextureHeight(JNIEnv* env, jobject c
    return Caches::getInstance().maxTextureSize;
}

static void android_view_GLES20Canvas_setOverrideXfermode(JNIEnv* env, jobject clazz,
        jlong rendererPtr, int xfermode) {
    DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
    renderer->setOverrideXfermode(xfermode);
}

// ----------------------------------------------------------------------------
// State
// ----------------------------------------------------------------------------
@@ -964,6 +970,8 @@ static JNINativeMethod gMethods[] = {
    { "nGetMaximumTextureWidth",  "()I",       (void*) android_view_GLES20Canvas_getMaxTextureWidth },
    { "nGetMaximumTextureHeight", "()I",       (void*) android_view_GLES20Canvas_getMaxTextureHeight },

    { "nSetOverrideXfermode", "(JI)V",       (void*) android_view_GLES20Canvas_setOverrideXfermode },

#endif
};

+9 −0
Original line number Diff line number Diff line
@@ -249,6 +249,15 @@ public class Canvas {
    /** @hide */
    public void insertInorderBarrier() {}

    /**
     * Set a transfer mode that overrides any transfer modes
     * in paints used for drawing. Pass null to disable this
     * override. Only implemented in GLES20Canvas.
     *
     * @hide
     */
    public void setOverrideXfermode(@Nullable PorterDuff.Mode xfermode) {}

    /**
     * Return true if the device that the current layer draws into is opaque
     * (i.e. does not support per-pixel alpha).
+1 −0
Original line number Diff line number Diff line
@@ -39,6 +39,7 @@ DisplayListRenderer::DisplayListRenderer()
    , mTranslateY(0.0f)
    , mDeferredBarrierType(kBarrier_None)
    , mHighContrastText(false)
    , mOverrideXfermode(-1)
    , mRestoreSaveCount(-1) {
}

+33 −12
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@
#include <SkMatrix.h>
#include <SkPaint.h>
#include <SkPath.h>
#include <SkPorterDuff.h>
#include <cutils/compiler.h>

#include "DisplayListLogBuffer.h"
@@ -161,6 +162,15 @@ public:
    void setHighContrastText(bool highContrastText) {
        mHighContrastText = highContrastText;
    }

    void setOverrideXfermode(int xfermode) {
        if (xfermode != -1) {
            SkPorterDuff::Mode porterDuffMode = static_cast<SkPorterDuff::Mode>(xfermode);
            xfermode = SkPorterDuff::ToXfermodeMode(porterDuffMode);
        }
        mOverrideXfermode = xfermode;
    };

private:
    enum DeferredBarrierType {
        kBarrier_None,
@@ -220,7 +230,14 @@ private:
    inline const SkPaint* refPaint(const SkPaint* paint) {
        if (!paint) return NULL;

        const SkPaint* paintCopy = mPaintMap.valueFor(paint);
        const SkPaint* paintCopy;

        if (mOverrideXfermode != -1) {
            SkPaint* overriddenPaint = copyPaint(paint);
            overriddenPaint->setXfermodeMode(static_cast<SkXfermode::Mode>(mOverrideXfermode));
            paintCopy = overriddenPaint;
        } else {
            paintCopy = mPaintMap.valueFor(paint);
            if (paintCopy == NULL
                    || paintCopy->getGenerationID() != paint->getGenerationID()
                    // We can't compare shader pointers because that will always
@@ -233,6 +250,7 @@ private:
                // replaceValueFor() performs an add if the entry doesn't exist
                mPaintMap.replaceValueFor(paint, paintCopy);
            }
        }

        return paintCopy;
    }
@@ -304,6 +322,9 @@ private:
    DeferredBarrierType mDeferredBarrierType;
    bool mHighContrastText;

    // -1 if unset, or SkXfermode::Mode value if set
    int mOverrideXfermode;

    int mRestoreSaveCount;

    friend class RenderNode;