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

* commit '41a8043b30a289bdba55a2469e598b3fe67c3bf1':
  Add a way to override Xfermode DO NOT MERGE
This commit is contained in:
Rob Tsuk
2014-11-12 22:36:18 +00:00
committed by Android Git Automerger
5 changed files with 62 additions and 12 deletions

View File

@@ -994,4 +994,15 @@ class GLES20Canvas extends HardwareCanvas {
int indexOffset, int indexCount, Paint paint) { int indexOffset, int indexCount, Paint paint) {
// TODO: Implement // 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);
} }

View File

@@ -172,6 +172,12 @@ static jint android_view_GLES20Canvas_getMaxTextureHeight(JNIEnv* env, jobject c
return Caches::getInstance().maxTextureSize; 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 // State
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@@ -964,6 +970,8 @@ static JNINativeMethod gMethods[] = {
{ "nGetMaximumTextureWidth", "()I", (void*) android_view_GLES20Canvas_getMaxTextureWidth }, { "nGetMaximumTextureWidth", "()I", (void*) android_view_GLES20Canvas_getMaxTextureWidth },
{ "nGetMaximumTextureHeight", "()I", (void*) android_view_GLES20Canvas_getMaxTextureHeight }, { "nGetMaximumTextureHeight", "()I", (void*) android_view_GLES20Canvas_getMaxTextureHeight },
{ "nSetOverrideXfermode", "(JI)V", (void*) android_view_GLES20Canvas_setOverrideXfermode },
#endif #endif
}; };

View File

@@ -249,6 +249,15 @@ public class Canvas {
/** @hide */ /** @hide */
public void insertInorderBarrier() {} 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 * Return true if the device that the current layer draws into is opaque
* (i.e. does not support per-pixel alpha). * (i.e. does not support per-pixel alpha).

View File

@@ -39,6 +39,7 @@ DisplayListRenderer::DisplayListRenderer()
, mTranslateY(0.0f) , mTranslateY(0.0f)
, mDeferredBarrierType(kBarrier_None) , mDeferredBarrierType(kBarrier_None)
, mHighContrastText(false) , mHighContrastText(false)
, mOverrideXfermode(-1)
, mRestoreSaveCount(-1) { , mRestoreSaveCount(-1) {
} }

View File

@@ -20,6 +20,7 @@
#include <SkMatrix.h> #include <SkMatrix.h>
#include <SkPaint.h> #include <SkPaint.h>
#include <SkPath.h> #include <SkPath.h>
#include <SkPorterDuff.h>
#include <cutils/compiler.h> #include <cutils/compiler.h>
#include "DisplayListLogBuffer.h" #include "DisplayListLogBuffer.h"
@@ -161,6 +162,15 @@ public:
void setHighContrastText(bool highContrastText) { void setHighContrastText(bool highContrastText) {
mHighContrastText = 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: private:
enum DeferredBarrierType { enum DeferredBarrierType {
kBarrier_None, kBarrier_None,
@@ -220,18 +230,26 @@ private:
inline const SkPaint* refPaint(const SkPaint* paint) { inline const SkPaint* refPaint(const SkPaint* paint) {
if (!paint) return NULL; if (!paint) return NULL;
const SkPaint* paintCopy = mPaintMap.valueFor(paint); const SkPaint* paintCopy;
if (paintCopy == NULL
|| paintCopy->getGenerationID() != paint->getGenerationID() if (mOverrideXfermode != -1) {
// We can't compare shader pointers because that will always SkPaint* overriddenPaint = copyPaint(paint);
// change as we do partial copying via wrapping. However, if the overriddenPaint->setXfermodeMode(static_cast<SkXfermode::Mode>(mOverrideXfermode));
// shader changes the paint generationID will have changed and paintCopy = overriddenPaint;
// so we don't hit this comparison anyway } else {
|| !(paint->getShader() && paintCopy->getShader() paintCopy = mPaintMap.valueFor(paint);
&& paint->getShader()->getGenerationID() == paintCopy->getShader()->getGenerationID())) { if (paintCopy == NULL
paintCopy = copyPaint(paint); || paintCopy->getGenerationID() != paint->getGenerationID()
// replaceValueFor() performs an add if the entry doesn't exist // We can't compare shader pointers because that will always
mPaintMap.replaceValueFor(paint, paintCopy); // change as we do partial copying via wrapping. However, if the
// shader changes the paint generationID will have changed and
// so we don't hit this comparison anyway
|| !(paint->getShader() && paintCopy->getShader()
&& paint->getShader()->getGenerationID() == paintCopy->getShader()->getGenerationID())) {
paintCopy = copyPaint(paint);
// replaceValueFor() performs an add if the entry doesn't exist
mPaintMap.replaceValueFor(paint, paintCopy);
}
} }
return paintCopy; return paintCopy;
@@ -304,6 +322,9 @@ private:
DeferredBarrierType mDeferredBarrierType; DeferredBarrierType mDeferredBarrierType;
bool mHighContrastText; bool mHighContrastText;
// -1 if unset, or SkXfermode::Mode value if set
int mOverrideXfermode;
int mRestoreSaveCount; int mRestoreSaveCount;
friend class RenderNode; friend class RenderNode;