blob: 261e45bcb47474afea48d92d963a4c5049292b33 [file] [log] [blame]
// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "third_party/blink/renderer/platform/graphics/compositing_reasons.h"
#include <array>
#include "third_party/blink/renderer/platform/wtf/std_lib_extras.h"
#include "third_party/blink/renderer/platform/wtf/text/string_builder.h"
namespace blink {
namespace {
#define V(name) #name,
constexpr auto kShortNames =
std::to_array<const char* const>({FOR_EACH_COMPOSITING_REASON(V)});
#undef V
struct ReasonAndDescription {
CompositingReasons reason;
const char* description;
};
constexpr auto kReasonDescriptionMap = std::to_array<ReasonAndDescription>({
{CompositingReason::k3DTransform, "Has a 3d transform."},
{CompositingReason::k3DScale, "Has a 3d scale."},
{CompositingReason::k3DRotate, "Has a 3d rotate."},
{CompositingReason::k3DTranslate, "Has a 3d translate."},
{CompositingReason::kTrivial3DTransform, "Has a trivial 3d transform."},
{CompositingReason::kIFrame, "Is an accelerated iFrame."},
{CompositingReason::kActiveTransformAnimation,
"Has an active accelerated transform animation or transition."},
{CompositingReason::kActiveScaleAnimation,
"Has an active accelerated scale animation or transition."},
{CompositingReason::kActiveRotateAnimation,
"Has an active accelerated rotate animation or transition."},
{CompositingReason::kActiveTranslateAnimation,
"Has an active accelerated translate animation or transition."},
{CompositingReason::kActiveOpacityAnimation,
"Has an active accelerated opacity animation or transition."},
{CompositingReason::kActiveFilterAnimation,
"Has an active accelerated filter animation or transition."},
{CompositingReason::kActiveBackdropFilterAnimation,
"Has an active accelerated backdrop filter animation or transition."},
{CompositingReason::kAffectedByOuterViewportBoundsDelta,
"Is fixed position affected by outer viewport bounds delta."},
{CompositingReason::kAffectedBySafeAreaBottom,
"Is fixed position affected by safe area bottom."},
{CompositingReason::kFixedPosition,
"Is fixed position in a scrollable view."},
{CompositingReason::kUndoOverscroll,
"Is fixed position that should undo overscroll of the viewport."},
{CompositingReason::kStickyPosition, "Is sticky position."},
{CompositingReason::kAnchorPosition,
"Is an anchor-positioned element translated by its anchor's scroll "
"offset."},
{CompositingReason::kBackdropFilter, "Has a backdrop filter."},
{CompositingReason::kBackdropFilterMask, "Is a mask for backdrop filter."},
{CompositingReason::kRootScroller, "Is the document.rootScroller."},
{CompositingReason::kViewport, "Is for the visual viewport."},
{CompositingReason::kWillChangeTransform,
"Has a will-change: transform compositing hint."},
{CompositingReason::kWillChangeScale,
"Has a will-change: scale compositing hint."},
{CompositingReason::kWillChangeRotate,
"Has a will-change: rotate compositing hint."},
{CompositingReason::kWillChangeTranslate,
"Has a will-change: translate compositing hint."},
{CompositingReason::kWillChangeOpacity,
"Has a will-change: opacity compositing hint."},
{CompositingReason::kWillChangeFilter,
"Has a will-change: filter compositing hint."},
{CompositingReason::kWillChangeBackdropFilter,
"Has a will-change: backdrop-filter compositing hint."},
{CompositingReason::kWillChangeClipPath,
"Has a will-change: clip-path compositing hint."},
{CompositingReason::kWillChangeMixBlendMode,
"Has a will-change: mix-blend-mode compositing hint."},
{CompositingReason::kWillChangeOther,
"Has a will-change compositing hint other than transform, opacity, filter"
" and backdrop-filter."},
{CompositingReason::kBackfaceInvisibility3DAncestor,
"Ancestor in same 3D rendering context has a hidden backface."},
{CompositingReason::kTransform3DSceneLeaf,
"Leaf of a 3D scene, for flattening its descendants into that scene."},
{CompositingReason::kPerspectiveWith3DDescendants,
"Has a perspective transform that needs to be known by compositor because "
"of 3d descendants."},
{CompositingReason::kPreserve3DWith3DDescendants,
"Has a preserves-3d property that needs to be known by compositor because "
"of 3d descendants."},
{CompositingReason::kViewTransitionElement,
"This element is shared during view transition."},
{CompositingReason::kViewTransitionPseudoElement,
"This element is a part of a pseudo-element tree representing the view "
"transition."},
{CompositingReason::kViewTransitionElementDescendantWithClipPath,
"This element's ancestor is shared during view transition and it has a "
"clip-path"},
{CompositingReason::kOverflowScrolling,
"Is a scrollable overflow element using accelerated scrolling."},
{CompositingReason::kElementCapture,
"This element is undergoing element-level capture."},
{CompositingReason::kOverlap, "Overlaps other composited content."},
{CompositingReason::kBackfaceVisibilityHidden,
"Has backface-visibility: hidden."},
{CompositingReason::kFixedAttachmentBackground,
"Is an accelerated background-attachment:fixed background."},
{CompositingReason::kCaret, "Is a caret in an editor."},
{CompositingReason::kVideo, "Is an accelerated video."},
{CompositingReason::kCanvas,
"Is an accelerated canvas, or is a display list backed canvas that was "
"promoted to a layer based on a performance heuristic."},
{CompositingReason::kPlugin, "Is an accelerated plugin."},
{CompositingReason::kScrollbar, "Is an accelerated scrollbar."},
{CompositingReason::kLinkHighlight, "Is a tap highlight on a link."},
{CompositingReason::kDevToolsOverlay, "Is DevTools overlay."},
{CompositingReason::kViewTransitionContent,
"The layer containing the contents of a view transition element."},
});
} // anonymous namespace
std::vector<const char*> CompositingReason::ShortNames(
CompositingReasons reasons) {
std::vector<const char*> result;
if (reasons == kNone) {
return result;
}
for (size_t i = 0; i < std::size(kShortNames); i++) {
if (reasons & (UINT64_C(1) << i)) {
result.push_back(kShortNames[i]);
}
}
return result;
}
std::vector<const char*> CompositingReason::Descriptions(
CompositingReasons reasons) {
#define V(name) \
static_assert( \
CompositingReason::k##name == \
kReasonDescriptionMap[CompositingReason::kE##name].reason, \
"kReasonDescriptionMap needs update for CompositingReason::k" #name);
FOR_EACH_COMPOSITING_REASON(V)
#undef V
std::vector<const char*> result;
if (reasons == kNone) {
return result;
}
for (auto& map : kReasonDescriptionMap) {
if (reasons & map.reason) {
result.push_back(map.description);
}
}
return result;
}
String CompositingReason::ToString(CompositingReasons reasons) {
StringBuilder builder;
builder.AppendRange(ShortNames(reasons), ",");
return builder.ReleaseString();
}
} // namespace blink