commit ffcccf0867788adb5400d4511f5a050ff5acdd98
parent 555cad41c3fda6f8f89b32b116f40710c62a2baf
Author: Emilio Cobos Álvarez <emilio@crisal.io>
Date: Mon, 29 Dec 2025 20:44:06 +0000
Bug 2007185 - Implement StyleImage::IsOpaque() using switch. r=layout-reviewers,firefox-style-system-reviewers,boris
So that it's harder to miss a variant.
Differential Revision: https://phabricator.services.mozilla.com/D277386
Diffstat:
1 file changed, 46 insertions(+), 30 deletions(-)
diff --git a/layout/style/nsStyleStruct.cpp b/layout/style/nsStyleStruct.cpp
@@ -1607,41 +1607,57 @@ static bool GradientItemsAreOpaque(
template <>
bool StyleGradient::IsOpaque() const {
- if (IsLinear()) {
- return GradientItemsAreOpaque(AsLinear().items.AsSpan());
- }
- if (IsRadial()) {
- return GradientItemsAreOpaque(AsRadial().items.AsSpan());
- }
- return GradientItemsAreOpaque(AsConic().items.AsSpan());
+ switch (tag) {
+ case Tag::Linear:
+ return GradientItemsAreOpaque(AsLinear().items.AsSpan());
+ case Tag::Radial:
+ return GradientItemsAreOpaque(AsRadial().items.AsSpan());
+ case Tag::Conic:
+ return GradientItemsAreOpaque(AsConic().items.AsSpan());
+ }
+ MOZ_ASSERT_UNREACHABLE("Unexpected gradient type");
+ return false;
}
template <>
bool StyleImage::IsOpaque() const {
- if (IsImageSet()) {
- return FinalImage().IsOpaque();
- }
-
- if (!IsComplete()) {
- return false;
- }
-
- if (IsGradient()) {
- return AsGradient()->IsOpaque();
- }
-
- if (IsElement() || IsMozSymbolicIcon()) {
- return false;
+ switch (tag) {
+ case Tag::ImageSet:
+ return FinalImage().IsOpaque();
+ case Tag::Gradient:
+ return AsGradient()->IsOpaque();
+ case Tag::Url: {
+ if (!IsComplete()) {
+ return false;
+ }
+ MOZ_ASSERT(GetImageRequest(), "should've returned earlier above");
+ nsCOMPtr<imgIContainer> imageContainer;
+ GetImageRequest()->GetImage(getter_AddRefs(imageContainer));
+ MOZ_ASSERT(imageContainer, "IsComplete() said image container is ready");
+ return imageContainer->WillDrawOpaqueNow();
+ }
+ case Tag::CrossFade:
+ for (const auto& el : AsCrossFade()->elements.AsSpan()) {
+ if (el.image.IsColor()) {
+ if (el.image.AsColor().MaybeTransparent()) {
+ return false;
+ }
+ continue;
+ }
+ MOZ_ASSERT(el.image.IsImage());
+ if (!el.image.AsImage().IsOpaque()) {
+ return false;
+ }
+ }
+ return true;
+ case Tag::LightDark:
+ MOZ_FALLTHROUGH_ASSERT("Should be computed already");
+ case Tag::Element:
+ case Tag::MozSymbolicIcon:
+ case Tag::None:
+ break;
}
-
- MOZ_ASSERT(IsImageRequestType(), "unexpected image type");
- MOZ_ASSERT(GetImageRequest(), "should've returned earlier above");
-
- nsCOMPtr<imgIContainer> imageContainer;
- GetImageRequest()->GetImage(getter_AddRefs(imageContainer));
- MOZ_ASSERT(imageContainer, "IsComplete() said image container is ready");
-
- return imageContainer->WillDrawOpaqueNow();
+ return false;
}
template <>