diff options
Diffstat (limited to 'core')
-rw-r--r-- | core/java/android/view/RenderNode.java | 10 | ||||
-rw-r--r-- | core/java/android/view/ViewOutlineProvider.java | 7 | ||||
-rw-r--r-- | core/java/com/android/internal/widget/ActionBarContainer.java | 30 | ||||
-rw-r--r-- | core/jni/android/graphics/BitmapFactory.cpp | 4 | ||||
-rw-r--r-- | core/jni/android/graphics/NinePatchPeeker.cpp | 4 | ||||
-rw-r--r-- | core/jni/android/graphics/NinePatchPeeker.h | 4 | ||||
-rw-r--r-- | core/jni/android_view_RenderNode.cpp | 13 |
7 files changed, 50 insertions, 22 deletions
diff --git a/core/java/android/view/RenderNode.java b/core/java/android/view/RenderNode.java index e9ec565..eee4973 100644 --- a/core/java/android/view/RenderNode.java +++ b/core/java/android/view/RenderNode.java @@ -355,9 +355,10 @@ public class RenderNode { return nSetOutlineEmpty(mNativeRenderNode); } else if (outline.mRect != null) { return nSetOutlineRoundRect(mNativeRenderNode, outline.mRect.left, outline.mRect.top, - outline.mRect.right, outline.mRect.bottom, outline.mRadius); + outline.mRect.right, outline.mRect.bottom, outline.mRadius, outline.mAlpha); } else if (outline.mPath != null) { - return nSetOutlineConvexPath(mNativeRenderNode, outline.mPath.mNativePath); + return nSetOutlineConvexPath(mNativeRenderNode, outline.mPath.mNativePath, + outline.mAlpha); } throw new IllegalArgumentException("Unrecognized outline?"); } @@ -849,8 +850,9 @@ public class RenderNode { private static native boolean nSetProjectBackwards(long renderNode, boolean shouldProject); private static native boolean nSetProjectionReceiver(long renderNode, boolean shouldRecieve); private static native boolean nSetOutlineRoundRect(long renderNode, int left, int top, - int right, int bottom, float radius); - private static native boolean nSetOutlineConvexPath(long renderNode, long nativePath); + int right, int bottom, float radius, float alpha); + private static native boolean nSetOutlineConvexPath(long renderNode, long nativePath, + float alpha); private static native boolean nSetOutlineEmpty(long renderNode); private static native boolean nSetOutlineNone(long renderNode); private static native boolean nSetClipToOutline(long renderNode, boolean clipToOutline); diff --git a/core/java/android/view/ViewOutlineProvider.java b/core/java/android/view/ViewOutlineProvider.java index 64624ae..4054031 100644 --- a/core/java/android/view/ViewOutlineProvider.java +++ b/core/java/android/view/ViewOutlineProvider.java @@ -25,7 +25,8 @@ import android.graphics.drawable.Drawable; public abstract class ViewOutlineProvider { /** * Default outline provider for Views, which queries the Outline from the View's background, - * or returns <code>false</code> if the View does not have a background. + * or generates a 0 alpha, rectangular Outline the size of the View if a background + * isn't present. * * @see Drawable#getOutline(Outline) */ @@ -35,6 +36,10 @@ public abstract class ViewOutlineProvider { Drawable background = view.getBackground(); if (background != null) { background.getOutline(outline); + } else { + + outline.setRect(0, 0, view.getWidth(), view.getHeight()); + outline.setAlpha(0.0f); } } }; diff --git a/core/java/com/android/internal/widget/ActionBarContainer.java b/core/java/com/android/internal/widget/ActionBarContainer.java index 790b611..9e24844 100644 --- a/core/java/com/android/internal/widget/ActionBarContainer.java +++ b/core/java/com/android/internal/widget/ActionBarContainer.java @@ -16,10 +16,12 @@ package com.android.internal.widget; +import android.annotation.NonNull; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.ColorFilter; +import android.graphics.Outline; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.view.ActionMode; @@ -324,18 +326,36 @@ public class ActionBarContainer extends FrameLayout { * projection surfaces. */ private class ActionBarBackgroundDrawable extends Drawable { - @Override - public void draw(Canvas canvas) { + private Drawable getDrawable() { if (mIsSplit) { - if (mSplitBackground != null) mSplitBackground.draw(canvas); + if (mSplitBackground != null) { + return mSplitBackground; + } } else { if (mBackground != null) { - mBackground.draw(canvas); + return mBackground; } if (mStackedBackground != null && mIsStacked) { - mStackedBackground.draw(canvas); + return mStackedBackground; } } + return null; + } + + @Override + public void draw(Canvas canvas) { + final Drawable drawable = getDrawable(); + if (drawable != null) { + drawable.draw(canvas); + } + } + + @Override + public void getOutline(@NonNull Outline outline) { + final Drawable drawable = getDrawable(); + if (drawable != null) { + drawable.getOutline(outline); + } } @Override diff --git a/core/jni/android/graphics/BitmapFactory.cpp b/core/jni/android/graphics/BitmapFactory.cpp index a890eb4..2ce1b15 100644 --- a/core/jni/android/graphics/BitmapFactory.cpp +++ b/core/jni/android/graphics/BitmapFactory.cpp @@ -353,7 +353,7 @@ static jobject doDecode(JNIEnv* env, SkStreamRewindable* stream, jobject padding ninePatchInsets = env->NewObject(gInsetStruct_class, gInsetStruct_constructorMethodID, peeker.mOpticalInsets[0], peeker.mOpticalInsets[1], peeker.mOpticalInsets[2], peeker.mOpticalInsets[3], peeker.mOutlineInsets[0], peeker.mOutlineInsets[1], peeker.mOutlineInsets[2], peeker.mOutlineInsets[3], - peeker.mOutlineRadius, peeker.mOutlineFilled, scale); + peeker.mOutlineRadius, peeker.mOutlineAlpha, scale); if (javaBitmap != NULL) { env->SetObjectField(javaBitmap, gBitmap_ninePatchInsetsFieldID, ninePatchInsets); } @@ -589,7 +589,7 @@ int register_android_graphics_BitmapFactory(JNIEnv* env) { "Landroid/graphics/NinePatch$InsetStruct;"); gInsetStruct_class = (jclass) env->NewGlobalRef(env->FindClass("android/graphics/NinePatch$InsetStruct")); - gInsetStruct_constructorMethodID = env->GetMethodID(gInsetStruct_class, "<init>", "(IIIIIIIIFZF)V"); + gInsetStruct_constructorMethodID = env->GetMethodID(gInsetStruct_class, "<init>", "(IIIIIIIIFIF)V"); int ret = AndroidRuntime::registerNativeMethods(env, "android/graphics/BitmapFactory$Options", diff --git a/core/jni/android/graphics/NinePatchPeeker.cpp b/core/jni/android/graphics/NinePatchPeeker.cpp index ea5193b..1dafa1b 100644 --- a/core/jni/android/graphics/NinePatchPeeker.cpp +++ b/core/jni/android/graphics/NinePatchPeeker.cpp @@ -48,11 +48,11 @@ bool NinePatchPeeker::peek(const char tag[], const void* data, size_t length) { } else if (!strcmp("npLb", tag) && length == sizeof(int32_t) * 4) { mHasInsets = true; memcpy(&mOpticalInsets, data, sizeof(int32_t) * 4); - } else if (!strcmp("npOl", tag) && length == 24) { // 4 int32_ts, 1 float, 1 int32_t sized bool + } else if (!strcmp("npOl", tag) && length == 24) { // 4 int32_ts, 1 float, 1 int32_t sized byte mHasInsets = true; memcpy(&mOutlineInsets, data, sizeof(int32_t) * 4); mOutlineRadius = ((const float*)data)[4]; - mOutlineFilled = ((const int32_t*)data)[5] & 0x01; + mOutlineAlpha = ((const int32_t*)data)[5] & 0xff; } return true; // keep on decoding } diff --git a/core/jni/android/graphics/NinePatchPeeker.h b/core/jni/android/graphics/NinePatchPeeker.h index 8d3e6cf..7c18b2d 100644 --- a/core/jni/android/graphics/NinePatchPeeker.h +++ b/core/jni/android/graphics/NinePatchPeeker.h @@ -33,7 +33,7 @@ public: , mPatchSize(0) , mHasInsets(false) , mOutlineRadius(0) - , mOutlineFilled(false) { + , mOutlineAlpha(0) { memset(mOpticalInsets, 0, 4 * sizeof(int32_t)); memset(mOutlineInsets, 0, 4 * sizeof(int32_t)); } @@ -50,7 +50,7 @@ public: int32_t mOpticalInsets[4]; int32_t mOutlineInsets[4]; float mOutlineRadius; - bool mOutlineFilled; + uint8_t mOutlineAlpha; }; #endif // NinePatchPeeker_h diff --git a/core/jni/android_view_RenderNode.cpp b/core/jni/android_view_RenderNode.cpp index ff54fb9..1e9d722 100644 --- a/core/jni/android_view_RenderNode.cpp +++ b/core/jni/android_view_RenderNode.cpp @@ -140,18 +140,19 @@ static jboolean android_view_RenderNode_setProjectionReceiver(JNIEnv* env, static jboolean android_view_RenderNode_setOutlineRoundRect(JNIEnv* env, jobject clazz, jlong renderNodePtr, jint left, jint top, - jint right, jint bottom, jfloat radius) { + jint right, jint bottom, jfloat radius, jfloat alpha) { RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); - renderNode->mutateStagingProperties().mutableOutline().setRoundRect(left, top, right, bottom, radius); + renderNode->mutateStagingProperties().mutableOutline().setRoundRect(left, top, right, bottom, + radius, alpha); renderNode->setPropertyFieldsDirty(RenderNode::GENERIC); return true; } static jboolean android_view_RenderNode_setOutlineConvexPath(JNIEnv* env, - jobject clazz, jlong renderNodePtr, jlong outlinePathPtr) { + jobject clazz, jlong renderNodePtr, jlong outlinePathPtr, jfloat alpha) { RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); SkPath* outlinePath = reinterpret_cast<SkPath*>(outlinePathPtr); - renderNode->mutateStagingProperties().mutableOutline().setConvexPath(outlinePath); + renderNode->mutateStagingProperties().mutableOutline().setConvexPath(outlinePath, alpha); renderNode->setPropertyFieldsDirty(RenderNode::GENERIC); return true; } @@ -480,8 +481,8 @@ static JNINativeMethod gMethods[] = { { "nSetProjectBackwards", "(JZ)Z", (void*) android_view_RenderNode_setProjectBackwards }, { "nSetProjectionReceiver","(JZ)Z", (void*) android_view_RenderNode_setProjectionReceiver }, - { "nSetOutlineRoundRect", "(JIIIIF)Z", (void*) android_view_RenderNode_setOutlineRoundRect }, - { "nSetOutlineConvexPath", "(JJ)Z", (void*) android_view_RenderNode_setOutlineConvexPath }, + { "nSetOutlineRoundRect", "(JIIIIFF)Z", (void*) android_view_RenderNode_setOutlineRoundRect }, + { "nSetOutlineConvexPath", "(JJF)Z", (void*) android_view_RenderNode_setOutlineConvexPath }, { "nSetOutlineEmpty", "(J)Z", (void*) android_view_RenderNode_setOutlineEmpty }, { "nSetOutlineNone", "(J)Z", (void*) android_view_RenderNode_setOutlineNone }, { "nSetClipToOutline", "(JZ)Z", (void*) android_view_RenderNode_setClipToOutline }, |