Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 856f0cc3 authored by Chris Craik's avatar Chris Craik
Browse files

Promote RenderProperties with an alpha to have a RenderLayer

bug:20254728
Change-Id: I0bd1d440fe46683b291d4c8ab07a630c34b2eadc
parent 580c30a6
Loading
Loading
Loading
Loading
+5 −22
Original line number Diff line number Diff line
@@ -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
@@ -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())) {
@@ -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) {
+3 −14
Original line number Diff line number Diff line
@@ -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) {
+16 −4
Original line number Diff line number Diff line
@@ -73,10 +73,6 @@ public:
        return false;
    }

    LayerType type() const {
        return mType;
    }

    bool setOpaque(bool opaque) {
        return RP_SET(mOpaque, opaque);
    }
@@ -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;
@@ -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 {