Loading libs/hwui/RenderNode.cpp +5 −22 Original line number Diff line number Diff line Loading @@ -138,7 +138,7 @@ void RenderNode::damageSelf(TreeInfo& info) { } void RenderNode::prepareLayer(TreeInfo& info, uint32_t dirtyMask) { LayerType layerType = properties().layerProperties().type(); LayerType layerType = properties().effectiveLayerType(); if (CC_UNLIKELY(layerType == LayerType::RenderLayer)) { // Damage applied so far needs to affect our parent, but does not require // the layer to be updated. So we pop/push here to clear out the current Loading @@ -153,7 +153,7 @@ void RenderNode::prepareLayer(TreeInfo& info, uint32_t dirtyMask) { } void RenderNode::pushLayerUpdate(TreeInfo& info) { LayerType layerType = properties().layerProperties().type(); LayerType layerType = properties().effectiveLayerType(); // If we are not a layer OR we cannot be rendered (eg, view was detached) // we need to destroy any Layers we may have had previously if (CC_LIKELY(layerType != LayerType::RenderLayer) || CC_UNLIKELY(!isRenderable())) { Loading Loading @@ -384,33 +384,16 @@ void RenderNode::setViewProperties(OpenGLRenderer& renderer, T& handler) { renderer.concatMatrix(*properties().getTransformMatrix()); } } const bool isLayer = properties().layerProperties().type() != LayerType::None; const bool isLayer = properties().effectiveLayerType() != LayerType::None; int clipFlags = properties().getClippingFlags(); if (properties().getAlpha() < 1) { if (isLayer) { clipFlags &= ~CLIP_TO_BOUNDS; // bounds clipping done by layer renderer.setOverrideLayerAlpha(properties().getAlpha()); } else if (!properties().getHasOverlappingRendering()) { renderer.scaleAlpha(properties().getAlpha()); } else { Rect layerBounds(0, 0, getWidth(), getHeight()); int saveFlags = SkCanvas::kHasAlphaLayer_SaveFlag; if (clipFlags) { saveFlags |= SkCanvas::kClipToLayer_SaveFlag; properties().getClippingRectForFlags(clipFlags, &layerBounds); clipFlags = 0; // all clipping done by saveLayer } ATRACE_FORMAT("%s alpha caused %ssaveLayer %dx%d", getName(), (saveFlags & SkCanvas::kClipToLayer_SaveFlag) ? "" : "unclipped ", static_cast<int>(layerBounds.getWidth()), static_cast<int>(layerBounds.getHeight())); SaveLayerOp* op = new (handler.allocator()) SaveLayerOp( layerBounds.left, layerBounds.top, layerBounds.right, layerBounds.bottom, properties().getAlpha() * 255, saveFlags); handler(op, PROPERTY_SAVECOUNT, properties().getClipToBounds()); LOG_ALWAYS_FATAL_IF(properties().getHasOverlappingRendering()); renderer.scaleAlpha(properties().getAlpha()); } } if (clipFlags) { Loading libs/hwui/RenderProperties.cpp +3 −14 Original line number Diff line number Diff line Loading @@ -144,27 +144,16 @@ void RenderProperties::debugOutputProperties(const int level) const { } } const bool isLayer = layerProperties().type() != LayerType::None; const bool isLayer = effectiveLayerType() != LayerType::None; int clipFlags = getClippingFlags(); if (mPrimitiveFields.mAlpha < 1) { if (isLayer) { clipFlags &= ~CLIP_TO_BOUNDS; // bounds clipping done by layer ALOGD("%*sSetOverrideLayerAlpha %.2f", level * 2, "", mPrimitiveFields.mAlpha); } else if (!mPrimitiveFields.mHasOverlappingRendering) { ALOGD("%*sScaleAlpha %.2f", level * 2, "", mPrimitiveFields.mAlpha); } else { Rect layerBounds(0, 0, getWidth(), getHeight()); int saveFlags = SkCanvas::kHasAlphaLayer_SaveFlag; if (clipFlags) { saveFlags |= SkCanvas::kClipToLayer_SaveFlag; getClippingRectForFlags(clipFlags, &layerBounds); clipFlags = 0; // all clipping done by saveLayer } ALOGD("%*sSaveLayerAlpha %d, %d, %d, %d, %d, 0x%x", level * 2, "", (int)layerBounds.left, (int)layerBounds.top, (int)layerBounds.right, (int)layerBounds.bottom, (int)(mPrimitiveFields.mAlpha * 255), saveFlags); LOG_ALWAYS_FATAL_IF(mPrimitiveFields.mHasOverlappingRendering); ALOGD("%*sScaleAlpha %.2f", level * 2, "", mPrimitiveFields.mAlpha); } } if (clipFlags) { Loading libs/hwui/RenderProperties.h +16 −4 Original line number Diff line number Diff line Loading @@ -73,10 +73,6 @@ public: return false; } LayerType type() const { return mType; } bool setOpaque(bool opaque) { return RP_SET(mOpaque, opaque); } Loading Loading @@ -122,6 +118,11 @@ private: ~LayerProperties(); void reset(); // Private since external users should go through properties().effectiveLayerType() LayerType type() const { return mType; } friend class RenderProperties; LayerType mType = LayerType::None; Loading Loading @@ -575,6 +576,17 @@ public: && getOutline().getAlpha() != 0.0f; } LayerType effectiveLayerType() const { LayerType type = mLayerProperties.mType; if (type == LayerType::None && !MathUtils::isZero(mPrimitiveFields.mAlpha) && mPrimitiveFields.mAlpha < 1 && mPrimitiveFields.mHasOverlappingRendering) { return LayerType::RenderLayer; } return type; } private: // Rendering properties struct PrimitiveFields { Loading Loading
libs/hwui/RenderNode.cpp +5 −22 Original line number Diff line number Diff line Loading @@ -138,7 +138,7 @@ void RenderNode::damageSelf(TreeInfo& info) { } void RenderNode::prepareLayer(TreeInfo& info, uint32_t dirtyMask) { LayerType layerType = properties().layerProperties().type(); LayerType layerType = properties().effectiveLayerType(); if (CC_UNLIKELY(layerType == LayerType::RenderLayer)) { // Damage applied so far needs to affect our parent, but does not require // the layer to be updated. So we pop/push here to clear out the current Loading @@ -153,7 +153,7 @@ void RenderNode::prepareLayer(TreeInfo& info, uint32_t dirtyMask) { } void RenderNode::pushLayerUpdate(TreeInfo& info) { LayerType layerType = properties().layerProperties().type(); LayerType layerType = properties().effectiveLayerType(); // If we are not a layer OR we cannot be rendered (eg, view was detached) // we need to destroy any Layers we may have had previously if (CC_LIKELY(layerType != LayerType::RenderLayer) || CC_UNLIKELY(!isRenderable())) { Loading Loading @@ -384,33 +384,16 @@ void RenderNode::setViewProperties(OpenGLRenderer& renderer, T& handler) { renderer.concatMatrix(*properties().getTransformMatrix()); } } const bool isLayer = properties().layerProperties().type() != LayerType::None; const bool isLayer = properties().effectiveLayerType() != LayerType::None; int clipFlags = properties().getClippingFlags(); if (properties().getAlpha() < 1) { if (isLayer) { clipFlags &= ~CLIP_TO_BOUNDS; // bounds clipping done by layer renderer.setOverrideLayerAlpha(properties().getAlpha()); } else if (!properties().getHasOverlappingRendering()) { renderer.scaleAlpha(properties().getAlpha()); } else { Rect layerBounds(0, 0, getWidth(), getHeight()); int saveFlags = SkCanvas::kHasAlphaLayer_SaveFlag; if (clipFlags) { saveFlags |= SkCanvas::kClipToLayer_SaveFlag; properties().getClippingRectForFlags(clipFlags, &layerBounds); clipFlags = 0; // all clipping done by saveLayer } ATRACE_FORMAT("%s alpha caused %ssaveLayer %dx%d", getName(), (saveFlags & SkCanvas::kClipToLayer_SaveFlag) ? "" : "unclipped ", static_cast<int>(layerBounds.getWidth()), static_cast<int>(layerBounds.getHeight())); SaveLayerOp* op = new (handler.allocator()) SaveLayerOp( layerBounds.left, layerBounds.top, layerBounds.right, layerBounds.bottom, properties().getAlpha() * 255, saveFlags); handler(op, PROPERTY_SAVECOUNT, properties().getClipToBounds()); LOG_ALWAYS_FATAL_IF(properties().getHasOverlappingRendering()); renderer.scaleAlpha(properties().getAlpha()); } } if (clipFlags) { Loading
libs/hwui/RenderProperties.cpp +3 −14 Original line number Diff line number Diff line Loading @@ -144,27 +144,16 @@ void RenderProperties::debugOutputProperties(const int level) const { } } const bool isLayer = layerProperties().type() != LayerType::None; const bool isLayer = effectiveLayerType() != LayerType::None; int clipFlags = getClippingFlags(); if (mPrimitiveFields.mAlpha < 1) { if (isLayer) { clipFlags &= ~CLIP_TO_BOUNDS; // bounds clipping done by layer ALOGD("%*sSetOverrideLayerAlpha %.2f", level * 2, "", mPrimitiveFields.mAlpha); } else if (!mPrimitiveFields.mHasOverlappingRendering) { ALOGD("%*sScaleAlpha %.2f", level * 2, "", mPrimitiveFields.mAlpha); } else { Rect layerBounds(0, 0, getWidth(), getHeight()); int saveFlags = SkCanvas::kHasAlphaLayer_SaveFlag; if (clipFlags) { saveFlags |= SkCanvas::kClipToLayer_SaveFlag; getClippingRectForFlags(clipFlags, &layerBounds); clipFlags = 0; // all clipping done by saveLayer } ALOGD("%*sSaveLayerAlpha %d, %d, %d, %d, %d, 0x%x", level * 2, "", (int)layerBounds.left, (int)layerBounds.top, (int)layerBounds.right, (int)layerBounds.bottom, (int)(mPrimitiveFields.mAlpha * 255), saveFlags); LOG_ALWAYS_FATAL_IF(mPrimitiveFields.mHasOverlappingRendering); ALOGD("%*sScaleAlpha %.2f", level * 2, "", mPrimitiveFields.mAlpha); } } if (clipFlags) { Loading
libs/hwui/RenderProperties.h +16 −4 Original line number Diff line number Diff line Loading @@ -73,10 +73,6 @@ public: return false; } LayerType type() const { return mType; } bool setOpaque(bool opaque) { return RP_SET(mOpaque, opaque); } Loading Loading @@ -122,6 +118,11 @@ private: ~LayerProperties(); void reset(); // Private since external users should go through properties().effectiveLayerType() LayerType type() const { return mType; } friend class RenderProperties; LayerType mType = LayerType::None; Loading Loading @@ -575,6 +576,17 @@ public: && getOutline().getAlpha() != 0.0f; } LayerType effectiveLayerType() const { LayerType type = mLayerProperties.mType; if (type == LayerType::None && !MathUtils::isZero(mPrimitiveFields.mAlpha) && mPrimitiveFields.mAlpha < 1 && mPrimitiveFields.mHasOverlappingRendering) { return LayerType::RenderLayer; } return type; } private: // Rendering properties struct PrimitiveFields { Loading