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:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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).
|
||||||
|
|||||||
@@ -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) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user