Loading core/java/android/view/View.java +21 −17 Original line number Diff line number Diff line Loading @@ -9485,17 +9485,26 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * <p>Sets the opacity of the view. This is a value from 0 to 1, where 0 means the view is * completely transparent and 1 means the view is completely opaque.</p> * * <p> Note that setting alpha to a translucent value (0 < alpha < 1) can have significant * performance implications, especially for large views. It is best to use the alpha property * sparingly and transiently, as in the case of fading animations.</p> * * <p>For a view with a frequently changing alpha, such as during a fading animation, it is * strongly recommended for performance reasons to either override * {@link #hasOverlappingRendering()} to return false if appropriate, or setting a * {@link #setLayerType(int, android.graphics.Paint) layer type} on the view.</p> * * <p>If this view overrides {@link #onSetAlpha(int)} to return true, then this view is * responsible for applying the opacity itself. Otherwise, calling this method is * equivalent to calling {@link #setLayerType(int, android.graphics.Paint)} and * setting a hardware layer.</p> * responsible for applying the opacity itself.</p> * * <p>Note that setting alpha to a translucent value (0 < alpha < 1) may have * performance implications. It is generally best to use the alpha property sparingly and * transiently, as in the case of fading animations.</p> * <p>Note that if the view is backed by a * {@link #setLayerType(int, android.graphics.Paint) layer} and is associated with a * {@link #setLayerPaint(android.graphics.Paint) layer paint}, setting an alpha value less than * 1.0 will supercede the alpha of the layer paint.</p> * * @param alpha The opacity of the view. * * @see #hasOverlappingRendering() * @see #setLayerType(int, android.graphics.Paint) * * @attr ref android.R.styleable#View_alpha Loading Loading @@ -12365,13 +12374,11 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * </ul> * * <p>If this view has an alpha value set to < 1.0 by calling * {@link #setAlpha(float)}, the alpha value of the layer's paint is replaced by * this view's alpha value. Calling {@link #setAlpha(float)} is therefore * equivalent to setting a hardware layer on this view and providing a paint with * the desired alpha value.</p> * {@link #setAlpha(float)}, the alpha value of the layer's paint is superceded * by this view's alpha value.</p> * * <p>Refer to the documentation of {@link #LAYER_TYPE_NONE disabled}, * {@link #LAYER_TYPE_SOFTWARE software} and {@link #LAYER_TYPE_HARDWARE hardware} * <p>Refer to the documentation of {@link #LAYER_TYPE_NONE}, * {@link #LAYER_TYPE_SOFTWARE} and {@link #LAYER_TYPE_HARDWARE} * for more information on when and how to use layers.</p> * * @param layerType The type of layer to use with this view, must be one of Loading Loading @@ -12441,11 +12448,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * <li>{@link android.graphics.Paint#getColorFilter() Color filter}</li> * </ul> * * <p>If this view has an alpha value set to < 1.0 by calling * {@link #setAlpha(float)}, the alpha value of the layer's paint is replaced by * this view's alpha value. Calling {@link #setAlpha(float)} is therefore * equivalent to setting a hardware layer on this view and providing a paint with * the desired alpha value.</p> * <p>If this view has an alpha value set to < 1.0 by calling {@link #setAlpha(float)}, the * alpha value of the layer's paint is superceded by this view's alpha value.</p> * * @param paint The paint used to compose the layer. This argument is optional * and can be null. It is ignored when the layer type is Loading libs/hwui/DisplayList.cpp +7 −2 Original line number Diff line number Diff line Loading @@ -352,7 +352,9 @@ void DisplayList::outputViewProperties(const int level) { } } if (mAlpha < 1) { if (mCaching || !mHasOverlappingRendering) { if (mCaching) { ALOGD("%*sSetOverrideLayerAlpha %.2f", level * 2, "", mAlpha); } else if (!mHasOverlappingRendering) { ALOGD("%*sScaleAlpha %.2f", level * 2, "", mAlpha); } else { int flags = SkCanvas::kHasAlphaLayer_SaveFlag; Loading Loading @@ -400,7 +402,9 @@ void DisplayList::setViewProperties(OpenGLRenderer& renderer, T& handler, } } if (mAlpha < 1) { if (mCaching || !mHasOverlappingRendering) { if (mCaching) { renderer.setOverrideLayerAlpha(mAlpha); } else if (!mHasOverlappingRendering) { renderer.scaleAlpha(mAlpha); } else { // TODO: should be able to store the size of a DL at record time and not Loading Loading @@ -513,6 +517,7 @@ void DisplayList::iterate(OpenGLRenderer& renderer, T& handler, const int level) DISPLAY_LIST_LOGD("%*sRestoreToCount %d", (level + 1) * 2, "", restoreTo); handler(mRestoreToCountOp->reinit(restoreTo), PROPERTY_SAVECOUNT); renderer.restoreToCount(restoreTo); renderer.setOverrideLayerAlpha(1.0f); } }; // namespace uirenderer Loading libs/hwui/OpenGLRenderer.cpp +20 −5 Original line number Diff line number Diff line Loading @@ -114,6 +114,7 @@ OpenGLRenderer::OpenGLRenderer(): mCaches(Caches::getInstance()), mExtensions(Extensions::getInstance()) { mDrawModifiers.mShader = NULL; mDrawModifiers.mColorFilter = NULL; mDrawModifiers.mOverrideLayerAlpha = 1.0f; mDrawModifiers.mHasShadow = false; mDrawModifiers.mHasDrawFilter = false; Loading Loading @@ -1074,7 +1075,7 @@ void OpenGLRenderer::composeLayerRect(Layer* layer, const Rect& rect, bool swap) layer->setFilter(GL_LINEAR, true); } float alpha = layer->getAlpha() / 255.0f * mSnapshot->alpha; float alpha = getLayerAlpha(layer); bool blend = layer->isBlend() || alpha < 1.0f; drawTextureMesh(x, y, x + rect.getWidth(), y + rect.getHeight(), layer->getTexture(), alpha, layer->getMode(), blend, Loading Loading @@ -1112,7 +1113,7 @@ void OpenGLRenderer::composeLayerRegion(Layer* layer, const Rect& rect) { rects = safeRegion.getArray(&count); } const float alpha = layer->getAlpha() / 255.0f * mSnapshot->alpha; const float alpha = getLayerAlpha(layer); const float texX = 1.0f / float(layer->getWidth()); const float texY = 1.0f / float(layer->getHeight()); const float height = rect.getHeight(); Loading Loading @@ -2237,7 +2238,7 @@ status_t OpenGLRenderer::drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const float left, float top, float right, float bottom, SkPaint* paint) { int alpha; SkXfermode::Mode mode; getAlphaAndModeDirect(paint, &alpha, &mode); getAlphaAndMode(paint, &alpha, &mode); return drawPatch(bitmap, xDivs, yDivs, colors, width, height, numColors, left, top, right, bottom, alpha, mode); Loading Loading @@ -2990,7 +2991,7 @@ status_t OpenGLRenderer::drawLayer(Layer* layer, float x, float y) { if (layer->region.isRect()) { composeLayerRect(layer, layer->regionRect); } else if (layer->mesh) { const float a = layer->getAlpha() / 255.0f * mSnapshot->alpha; const float a = getLayerAlpha(layer); setupDraw(); setupDrawWithTexture(); setupDrawColor(a, a, a, a); Loading Loading @@ -3446,10 +3447,24 @@ void OpenGLRenderer::resetDrawTextureTexCoords(float u1, float v1, float u2, flo TextureVertex::setUV(v++, u2, v2); } void OpenGLRenderer::getAlphaAndMode(SkPaint* paint, int* alpha, SkXfermode::Mode* mode) { void OpenGLRenderer::getAlphaAndMode(SkPaint* paint, int* alpha, SkXfermode::Mode* mode) const { getAlphaAndModeDirect(paint, alpha, mode); if (mDrawModifiers.mOverrideLayerAlpha < 1.0f) { // if drawing a layer, ignore the paint's alpha *alpha = mDrawModifiers.mOverrideLayerAlpha; } *alpha *= mSnapshot->alpha; } float OpenGLRenderer::getLayerAlpha(Layer* layer) const { float alpha; if (mDrawModifiers.mOverrideLayerAlpha < 1.0f) { alpha = mDrawModifiers.mOverrideLayerAlpha; } else { alpha = layer->getAlpha() / 255.0f; } return alpha * mSnapshot->alpha; } }; // namespace uirenderer }; // namespace android libs/hwui/OpenGLRenderer.h +16 −4 Original line number Diff line number Diff line Loading @@ -51,6 +51,7 @@ namespace uirenderer { struct DrawModifiers { SkiaShader* mShader; SkiaColorFilter* mColorFilter; float mOverrideLayerAlpha; // Drop shadow bool mHasShadow; Loading Loading @@ -275,6 +276,9 @@ public: virtual void resetPaintFilter(); virtual void setupPaintFilter(int clearBits, int setBits); // If this value is set to < 1.0, it overrides alpha set on layer (see drawBitmap, drawLayer) void setOverrideLayerAlpha(float alpha) { mDrawModifiers.mOverrideLayerAlpha = alpha; } SkPaint* filterPaint(SkPaint* paint); bool storeDisplayState(DeferredDisplayState& state, int stateDeferFlags); Loading @@ -283,7 +287,6 @@ public: const DrawModifiers& getDrawModifiers() { return mDrawModifiers; } void setDrawModifiers(const DrawModifiers& drawModifiers) { mDrawModifiers = drawModifiers; } // TODO: what does this mean? no perspective? no rotate? ANDROID_API bool isCurrentTransformSimple() { return mSnapshot->transform->isSimple(); } Loading Loading @@ -325,7 +328,8 @@ public: /** * Gets the alpha and xfermode out of a paint object. If the paint is null * alpha will be 255 and the xfermode will be SRC_OVER. This method does * not multiply the paint's alpha by the current snapshot's alpha. * not multiply the paint's alpha by the current snapshot's alpha, and does * not replace the alpha with the overrideLayerAlpha * * @param paint The paint to extract values from * @param alpha Where to store the resulting alpha Loading Loading @@ -450,13 +454,21 @@ protected: /** * Gets the alpha and xfermode out of a paint object. If the paint is null * alpha will be 255 and the xfermode will be SRC_OVER. * alpha will be 255 and the xfermode will be SRC_OVER. Accounts for both * snapshot alpha, and overrideLayerAlpha * * @param paint The paint to extract values from * @param alpha Where to store the resulting alpha * @param mode Where to store the resulting xfermode */ inline void getAlphaAndMode(SkPaint* paint, int* alpha, SkXfermode::Mode* mode); inline void getAlphaAndMode(SkPaint* paint, int* alpha, SkXfermode::Mode* mode) const; /** * Gets the alpha from a layer, accounting for snapshot alpha and overrideLayerAlpha * * @param layer The layer from which the alpha is extracted */ inline float getLayerAlpha(Layer* layer) const; /** * Safely retrieves the mode from the specified xfermode. If the specified Loading Loading
core/java/android/view/View.java +21 −17 Original line number Diff line number Diff line Loading @@ -9485,17 +9485,26 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * <p>Sets the opacity of the view. This is a value from 0 to 1, where 0 means the view is * completely transparent and 1 means the view is completely opaque.</p> * * <p> Note that setting alpha to a translucent value (0 < alpha < 1) can have significant * performance implications, especially for large views. It is best to use the alpha property * sparingly and transiently, as in the case of fading animations.</p> * * <p>For a view with a frequently changing alpha, such as during a fading animation, it is * strongly recommended for performance reasons to either override * {@link #hasOverlappingRendering()} to return false if appropriate, or setting a * {@link #setLayerType(int, android.graphics.Paint) layer type} on the view.</p> * * <p>If this view overrides {@link #onSetAlpha(int)} to return true, then this view is * responsible for applying the opacity itself. Otherwise, calling this method is * equivalent to calling {@link #setLayerType(int, android.graphics.Paint)} and * setting a hardware layer.</p> * responsible for applying the opacity itself.</p> * * <p>Note that setting alpha to a translucent value (0 < alpha < 1) may have * performance implications. It is generally best to use the alpha property sparingly and * transiently, as in the case of fading animations.</p> * <p>Note that if the view is backed by a * {@link #setLayerType(int, android.graphics.Paint) layer} and is associated with a * {@link #setLayerPaint(android.graphics.Paint) layer paint}, setting an alpha value less than * 1.0 will supercede the alpha of the layer paint.</p> * * @param alpha The opacity of the view. * * @see #hasOverlappingRendering() * @see #setLayerType(int, android.graphics.Paint) * * @attr ref android.R.styleable#View_alpha Loading Loading @@ -12365,13 +12374,11 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * </ul> * * <p>If this view has an alpha value set to < 1.0 by calling * {@link #setAlpha(float)}, the alpha value of the layer's paint is replaced by * this view's alpha value. Calling {@link #setAlpha(float)} is therefore * equivalent to setting a hardware layer on this view and providing a paint with * the desired alpha value.</p> * {@link #setAlpha(float)}, the alpha value of the layer's paint is superceded * by this view's alpha value.</p> * * <p>Refer to the documentation of {@link #LAYER_TYPE_NONE disabled}, * {@link #LAYER_TYPE_SOFTWARE software} and {@link #LAYER_TYPE_HARDWARE hardware} * <p>Refer to the documentation of {@link #LAYER_TYPE_NONE}, * {@link #LAYER_TYPE_SOFTWARE} and {@link #LAYER_TYPE_HARDWARE} * for more information on when and how to use layers.</p> * * @param layerType The type of layer to use with this view, must be one of Loading Loading @@ -12441,11 +12448,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * <li>{@link android.graphics.Paint#getColorFilter() Color filter}</li> * </ul> * * <p>If this view has an alpha value set to < 1.0 by calling * {@link #setAlpha(float)}, the alpha value of the layer's paint is replaced by * this view's alpha value. Calling {@link #setAlpha(float)} is therefore * equivalent to setting a hardware layer on this view and providing a paint with * the desired alpha value.</p> * <p>If this view has an alpha value set to < 1.0 by calling {@link #setAlpha(float)}, the * alpha value of the layer's paint is superceded by this view's alpha value.</p> * * @param paint The paint used to compose the layer. This argument is optional * and can be null. It is ignored when the layer type is Loading
libs/hwui/DisplayList.cpp +7 −2 Original line number Diff line number Diff line Loading @@ -352,7 +352,9 @@ void DisplayList::outputViewProperties(const int level) { } } if (mAlpha < 1) { if (mCaching || !mHasOverlappingRendering) { if (mCaching) { ALOGD("%*sSetOverrideLayerAlpha %.2f", level * 2, "", mAlpha); } else if (!mHasOverlappingRendering) { ALOGD("%*sScaleAlpha %.2f", level * 2, "", mAlpha); } else { int flags = SkCanvas::kHasAlphaLayer_SaveFlag; Loading Loading @@ -400,7 +402,9 @@ void DisplayList::setViewProperties(OpenGLRenderer& renderer, T& handler, } } if (mAlpha < 1) { if (mCaching || !mHasOverlappingRendering) { if (mCaching) { renderer.setOverrideLayerAlpha(mAlpha); } else if (!mHasOverlappingRendering) { renderer.scaleAlpha(mAlpha); } else { // TODO: should be able to store the size of a DL at record time and not Loading Loading @@ -513,6 +517,7 @@ void DisplayList::iterate(OpenGLRenderer& renderer, T& handler, const int level) DISPLAY_LIST_LOGD("%*sRestoreToCount %d", (level + 1) * 2, "", restoreTo); handler(mRestoreToCountOp->reinit(restoreTo), PROPERTY_SAVECOUNT); renderer.restoreToCount(restoreTo); renderer.setOverrideLayerAlpha(1.0f); } }; // namespace uirenderer Loading
libs/hwui/OpenGLRenderer.cpp +20 −5 Original line number Diff line number Diff line Loading @@ -114,6 +114,7 @@ OpenGLRenderer::OpenGLRenderer(): mCaches(Caches::getInstance()), mExtensions(Extensions::getInstance()) { mDrawModifiers.mShader = NULL; mDrawModifiers.mColorFilter = NULL; mDrawModifiers.mOverrideLayerAlpha = 1.0f; mDrawModifiers.mHasShadow = false; mDrawModifiers.mHasDrawFilter = false; Loading Loading @@ -1074,7 +1075,7 @@ void OpenGLRenderer::composeLayerRect(Layer* layer, const Rect& rect, bool swap) layer->setFilter(GL_LINEAR, true); } float alpha = layer->getAlpha() / 255.0f * mSnapshot->alpha; float alpha = getLayerAlpha(layer); bool blend = layer->isBlend() || alpha < 1.0f; drawTextureMesh(x, y, x + rect.getWidth(), y + rect.getHeight(), layer->getTexture(), alpha, layer->getMode(), blend, Loading Loading @@ -1112,7 +1113,7 @@ void OpenGLRenderer::composeLayerRegion(Layer* layer, const Rect& rect) { rects = safeRegion.getArray(&count); } const float alpha = layer->getAlpha() / 255.0f * mSnapshot->alpha; const float alpha = getLayerAlpha(layer); const float texX = 1.0f / float(layer->getWidth()); const float texY = 1.0f / float(layer->getHeight()); const float height = rect.getHeight(); Loading Loading @@ -2237,7 +2238,7 @@ status_t OpenGLRenderer::drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const float left, float top, float right, float bottom, SkPaint* paint) { int alpha; SkXfermode::Mode mode; getAlphaAndModeDirect(paint, &alpha, &mode); getAlphaAndMode(paint, &alpha, &mode); return drawPatch(bitmap, xDivs, yDivs, colors, width, height, numColors, left, top, right, bottom, alpha, mode); Loading Loading @@ -2990,7 +2991,7 @@ status_t OpenGLRenderer::drawLayer(Layer* layer, float x, float y) { if (layer->region.isRect()) { composeLayerRect(layer, layer->regionRect); } else if (layer->mesh) { const float a = layer->getAlpha() / 255.0f * mSnapshot->alpha; const float a = getLayerAlpha(layer); setupDraw(); setupDrawWithTexture(); setupDrawColor(a, a, a, a); Loading Loading @@ -3446,10 +3447,24 @@ void OpenGLRenderer::resetDrawTextureTexCoords(float u1, float v1, float u2, flo TextureVertex::setUV(v++, u2, v2); } void OpenGLRenderer::getAlphaAndMode(SkPaint* paint, int* alpha, SkXfermode::Mode* mode) { void OpenGLRenderer::getAlphaAndMode(SkPaint* paint, int* alpha, SkXfermode::Mode* mode) const { getAlphaAndModeDirect(paint, alpha, mode); if (mDrawModifiers.mOverrideLayerAlpha < 1.0f) { // if drawing a layer, ignore the paint's alpha *alpha = mDrawModifiers.mOverrideLayerAlpha; } *alpha *= mSnapshot->alpha; } float OpenGLRenderer::getLayerAlpha(Layer* layer) const { float alpha; if (mDrawModifiers.mOverrideLayerAlpha < 1.0f) { alpha = mDrawModifiers.mOverrideLayerAlpha; } else { alpha = layer->getAlpha() / 255.0f; } return alpha * mSnapshot->alpha; } }; // namespace uirenderer }; // namespace android
libs/hwui/OpenGLRenderer.h +16 −4 Original line number Diff line number Diff line Loading @@ -51,6 +51,7 @@ namespace uirenderer { struct DrawModifiers { SkiaShader* mShader; SkiaColorFilter* mColorFilter; float mOverrideLayerAlpha; // Drop shadow bool mHasShadow; Loading Loading @@ -275,6 +276,9 @@ public: virtual void resetPaintFilter(); virtual void setupPaintFilter(int clearBits, int setBits); // If this value is set to < 1.0, it overrides alpha set on layer (see drawBitmap, drawLayer) void setOverrideLayerAlpha(float alpha) { mDrawModifiers.mOverrideLayerAlpha = alpha; } SkPaint* filterPaint(SkPaint* paint); bool storeDisplayState(DeferredDisplayState& state, int stateDeferFlags); Loading @@ -283,7 +287,6 @@ public: const DrawModifiers& getDrawModifiers() { return mDrawModifiers; } void setDrawModifiers(const DrawModifiers& drawModifiers) { mDrawModifiers = drawModifiers; } // TODO: what does this mean? no perspective? no rotate? ANDROID_API bool isCurrentTransformSimple() { return mSnapshot->transform->isSimple(); } Loading Loading @@ -325,7 +328,8 @@ public: /** * Gets the alpha and xfermode out of a paint object. If the paint is null * alpha will be 255 and the xfermode will be SRC_OVER. This method does * not multiply the paint's alpha by the current snapshot's alpha. * not multiply the paint's alpha by the current snapshot's alpha, and does * not replace the alpha with the overrideLayerAlpha * * @param paint The paint to extract values from * @param alpha Where to store the resulting alpha Loading Loading @@ -450,13 +454,21 @@ protected: /** * Gets the alpha and xfermode out of a paint object. If the paint is null * alpha will be 255 and the xfermode will be SRC_OVER. * alpha will be 255 and the xfermode will be SRC_OVER. Accounts for both * snapshot alpha, and overrideLayerAlpha * * @param paint The paint to extract values from * @param alpha Where to store the resulting alpha * @param mode Where to store the resulting xfermode */ inline void getAlphaAndMode(SkPaint* paint, int* alpha, SkXfermode::Mode* mode); inline void getAlphaAndMode(SkPaint* paint, int* alpha, SkXfermode::Mode* mode) const; /** * Gets the alpha from a layer, accounting for snapshot alpha and overrideLayerAlpha * * @param layer The layer from which the alpha is extracted */ inline float getLayerAlpha(Layer* layer) const; /** * Safely retrieves the mode from the specified xfermode. If the specified Loading