blob: ef35fb1fffab783a39ddaa21d7c09b690541270b [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "core/paint/BoxDecorationData.h"
#include "core/layout/LayoutBox.h"
#include "core/style/BorderEdge.h"
#include "core/style/ComputedStyle.h"
#include "platform/RuntimeEnabledFeatures.h"
#include "platform/graphics/GraphicsContext.h"
namespace blink {
BoxDecorationData::BoxDecorationData(const LayoutBox& layoutBox)
{
backgroundColor = layoutBox.style()->visitedDependentColor(CSSPropertyBackgroundColor);
hasBackground = backgroundColor.alpha() || layoutBox.style()->hasBackgroundImage();
ASSERT(hasBackground == layoutBox.style()->hasBackground());
hasBorderDecoration = layoutBox.style()->hasBorderDecoration();
hasAppearance = layoutBox.style()->hasAppearance();
bleedAvoidance = determineBackgroundBleedAvoidance(layoutBox);
}
namespace {
bool borderObscuresBackgroundEdge(const ComputedStyle& style)
{
BorderEdge edges[4];
style.getBorderEdgeInfo(edges);
for (auto& edge : edges) {
if (!edge.obscuresBackgroundEdge())
return false;
}
return true;
}
} // anonymous namespace
BackgroundBleedAvoidance BoxDecorationData::determineBackgroundBleedAvoidance(const LayoutBox& layoutBox)
{
if (layoutBox.isDocumentElement())
return BackgroundBleedNone;
if (!hasBackground)
return BackgroundBleedNone;
if (!hasBorderDecoration || !layoutBox.style()->hasBorderRadius() || layoutBox.canRenderBorderImage()) {
if (layoutBox.backgroundShouldAlwaysBeClipped())
return BackgroundBleedClipOnly;
return BackgroundBleedNone;
}
if (borderObscuresBackgroundEdge(*layoutBox.style()))
return BackgroundBleedShrinkBackground;
return BackgroundBleedClipLayer;
}
} // namespace blink