コード例 #1
0
CompositingReasons CompositingReasonFinder::nonStyleDeterminedDirectReasons(const RenderLayer* layer, bool* needToRecomputeCompositingRequirements) const
{
    CompositingReasons directReasons = CompositingReasonNone;
    RenderObject* renderer = layer->renderer();

    if (requiresCompositingForAnimation(renderer))
        directReasons |= CompositingReasonActiveAnimation;

    if (m_renderView.compositorDrivenAcceleratedScrollingEnabled()) {
        if (requiresCompositingForOutOfFlowClipping(layer))
            directReasons |= CompositingReasonOutOfFlowClipping;

        if (requiresCompositingForOverflowScrollingParent(layer))
            directReasons |= CompositingReasonOverflowScrollingParent;
    }

    if (requiresCompositingForOverflowScrolling(layer))
        directReasons |= CompositingReasonOverflowScrollingTouch;

    if (requiresCompositingForPosition(renderer, layer, 0, needToRecomputeCompositingRequirements))
        directReasons |= renderer->style()->position() == FixedPosition ? CompositingReasonPositionFixed : CompositingReasonPositionSticky;

    directReasons |= renderer->additionalCompositingReasons(m_compositingTriggers);

    ASSERT(!(directReasons & CompositingReasonComboAllStyleDeterminedReasons));
    return directReasons;
}
コード例 #2
0
bool RenderLayerCompositor::requiresCompositingForMobileSites(const RenderLayer* layer) const
{
    // First, check if we are in an iframe, and if so bail out
    if (m_renderView->document()->frame()->tree()->parent())
        return false;

    RenderObject* renderer = layer->renderer();
    // Check for transforms
    if (requiresCompositingForTransform(renderer))
        return true;

    // Check for animations
    if (requiresCompositingForAnimation(renderer))
        return true;

#if ENABLE(COMPOSITED_FIXED_ELEMENTS)
    // For the moment, we want to only enable fixed composited layers on mobile websites.
    // We can consider a website as being a 'mobile' site if all the
    // following checks are true:
    // 1) - the viewport width is either undefined (-1) or equal to device-width (0), and
    // 2) - no scaling is allowed
    if (!layer->isFixed())
        return false;

    Settings* settings = m_renderView->document()->settings();
    if (!settings)
        return false;

    if ((settings->viewportWidth() == -1 || settings->viewportWidth() == 0) &&
        !settings->viewportUserScalable())
        return true;
#endif

    return false;
}
コード例 #3
0
// Note: this specifies whether the RL needs a compositing layer for intrinsic reasons.
// Use needsToBeComposited() to determine if a RL actually needs a compositing layer.
// static
bool RenderLayerCompositor::requiresCompositingLayer(const RenderLayer* layer) const
{
    RenderObject* renderer = layer->renderer();
    // The compositing state of a reflection should match that of its reflected layer.
    if (layer->isReflection()) {
        renderer = renderer->parent(); // The RenderReplica's parent is the object being reflected.
        layer = toRenderBoxModelObject(renderer)->layer();
    }
    // The root layer always has a compositing layer, but it may not have backing.
    return (inCompositingMode() && layer->isRootLayer()) ||
#if PLATFORM(ANDROID)
             requiresCompositingForMobileSites(layer) ||
#else
             requiresCompositingForTransform(renderer) ||
             requiresCompositingForVideo(renderer) ||
             requiresCompositingForCanvas(renderer) ||
             requiresCompositingForPlugin(renderer) ||
             requiresCompositingForAnimation(renderer) ||
#endif
             renderer->style()->backfaceVisibility() == BackfaceVisibilityHidden ||
             clipsCompositingDescendants(layer);
}
コード例 #4
0
CompositingReasons CompositingReasonFinder::styleDeterminedReasons(RenderObject* renderer) const
{
    CompositingReasons directReasons = CompositingReasonNone;

    if (requiresCompositingForTransform(renderer))
        directReasons |= CompositingReason3DTransform;

    if (requiresCompositingForBackfaceVisibilityHidden(renderer))
        directReasons |= CompositingReasonBackfaceVisibilityHidden;

    if (requiresCompositingForAnimation(renderer))
        directReasons |= CompositingReasonActiveAnimation;

    if (requiresCompositingForFilters(renderer))
        directReasons |= CompositingReasonFilters;

    if (requiresCompositingForWillChangeCompositingHint(renderer))
        directReasons |= CompositingReasonWillChangeCompositingHint;

    ASSERT(!(directReasons & ~CompositingReasonComboAllStyleDeterminedReasons));
    return directReasons;
}
コード例 #5
0
CompositingReasons CompositingReasonFinder::potentialCompositingReasonsFromStyle(LayoutObject* layoutObject) const
{
    if (RuntimeEnabledFeatures::slimmingPaintV2Enabled())
        return CompositingReasonNone;

    CompositingReasons reasons = CompositingReasonNone;

    const ComputedStyle& style = layoutObject->styleRef();

    if (requiresCompositingForTransform(layoutObject))
        reasons |= CompositingReason3DTransform;

    if (style.backfaceVisibility() == BackfaceVisibilityHidden)
        reasons |= CompositingReasonBackfaceVisibilityHidden;

    if (requiresCompositingForAnimation(style))
        reasons |= CompositingReasonActiveAnimation;

    if (style.hasWillChangeCompositingHint() && !style.subtreeWillChangeContents())
        reasons |= CompositingReasonWillChangeCompositingHint;

    if (style.hasInlineTransform())
        reasons |= CompositingReasonInlineTransform;

    if (style.transformStyle3D() == TransformStyle3DPreserve3D)
        reasons |= CompositingReasonPreserve3DWith3DDescendants;

    if (style.hasPerspective())
        reasons |= CompositingReasonPerspectiveWith3DDescendants;

    if (style.hasCompositorProxy())
        reasons |= CompositingReasonCompositorProxy;

    // If the implementation of createsGroup changes, we need to be aware of that in this part of code.
    ASSERT((layoutObject->isTransparent() || layoutObject->hasMask() || layoutObject->hasFilter() || style.hasBlendMode()) == layoutObject->createsGroup());

    if (style.hasMask())
        reasons |= CompositingReasonMaskWithCompositedDescendants;

    if (style.hasFilter())
        reasons |= CompositingReasonFilterWithCompositedDescendants;

    if (style.hasBackdropFilter())
        reasons |= CompositingReasonBackdropFilter;

    // See Layer::updateTransform for an explanation of why we check both.
    if (layoutObject->hasTransformRelatedProperty() && style.hasTransform())
        reasons |= CompositingReasonTransformWithCompositedDescendants;

    if (layoutObject->isTransparent())
        reasons |= CompositingReasonOpacityWithCompositedDescendants;

    if (style.hasBlendMode())
        reasons |= CompositingReasonBlendingWithCompositedDescendants;

    if (layoutObject->hasReflection())
        reasons |= CompositingReasonReflectionWithCompositedDescendants;

    ASSERT(!(reasons & ~CompositingReasonComboAllStyleDeterminedReasons));
    return reasons;
}