From 242553ef4bc2de14a57089b3e4ff95d19b53b9cb Mon Sep 17 00:00:00 2001 From: Stanca Serban Date: Wed, 2 Oct 2024 15:55:26 +0300 Subject: [PATCH] Backed out changeset 450c9dfc8858 (bug 1922208) for causing multiple failures. --- image/ClippedImage.cpp | 5 +++-- image/ClippedImage.h | 2 +- image/DynamicImage.cpp | 4 ++-- image/ImageWrapper.cpp | 2 +- image/OrientedImage.cpp | 6 +++--- image/OrientedImage.h | 2 +- image/RasterImage.cpp | 7 ++++--- image/SurfaceCache.cpp | 5 +++-- image/VectorImage.cpp | 10 ++++++---- image/imgIContainer.idl | 26 +++++++++++++++++--------- layout/base/nsLayoutUtils.cpp | 5 +++-- layout/generic/nsImageFrame.cpp | 4 ++-- layout/svg/SVGImageFrame.cpp | 5 ++++- widget/cocoa/nsCocoaUtils.mm | 8 ++++---- 14 files changed, 54 insertions(+), 37 deletions(-) diff --git a/image/ClippedImage.cpp b/image/ClippedImage.cpp index cdd2c569fb74..cad74ebdf8ad 100644 --- a/image/ClippedImage.cpp +++ b/image/ClippedImage.cpp @@ -205,11 +205,12 @@ ClippedImage::GetIntrinsicSize(nsSize* aSize) { return NS_OK; } -AspectRatio ClippedImage::GetIntrinsicRatio() { +Maybe ClippedImage::GetIntrinsicRatio() { if (!ShouldClip()) { return InnerImage()->GetIntrinsicRatio(); } - return AspectRatio::FromSize(mClip.Width(), mClip.Height()); + + return Some(AspectRatio::FromSize(mClip.Width(), mClip.Height())); } NS_IMETHODIMP_(already_AddRefed) diff --git a/image/ClippedImage.h b/image/ClippedImage.h index bb7a307b143f..43295a53f6bb 100644 --- a/image/ClippedImage.h +++ b/image/ClippedImage.h @@ -36,7 +36,7 @@ class ClippedImage : public ImageWrapper { NS_IMETHOD GetWidth(int32_t* aWidth) override; NS_IMETHOD GetHeight(int32_t* aHeight) override; NS_IMETHOD GetIntrinsicSize(nsSize* aSize) override; - AspectRatio GetIntrinsicRatio() override; + Maybe GetIntrinsicRatio() override; NS_IMETHOD_(already_AddRefed) GetFrame(uint32_t aWhichFrame, uint32_t aFlags) override; NS_IMETHOD_(already_AddRefed) diff --git a/image/DynamicImage.cpp b/image/DynamicImage.cpp index d93389a58e9f..923e91d35258 100644 --- a/image/DynamicImage.cpp +++ b/image/DynamicImage.cpp @@ -104,9 +104,9 @@ DynamicImage::GetIntrinsicSize(nsSize* aSize) { return NS_OK; } -AspectRatio DynamicImage::GetIntrinsicRatio() { +Maybe DynamicImage::GetIntrinsicRatio() { auto size = mDrawable->Size(); - return AspectRatio::FromSize(size.width, size.height); + return Some(AspectRatio::FromSize(size.width, size.height)); } NS_IMETHODIMP_(Orientation) diff --git a/image/ImageWrapper.cpp b/image/ImageWrapper.cpp index ecfae461dc3a..eafd6ffe0499 100644 --- a/image/ImageWrapper.cpp +++ b/image/ImageWrapper.cpp @@ -119,7 +119,7 @@ ImageWrapper::GetIntrinsicSize(nsSize* aSize) { return mInnerImage->GetIntrinsicSize(aSize); } -AspectRatio ImageWrapper::GetIntrinsicRatio() { +Maybe ImageWrapper::GetIntrinsicRatio() { return mInnerImage->GetIntrinsicRatio(); } diff --git a/image/OrientedImage.cpp b/image/OrientedImage.cpp index 47a293b71f61..8461405dcba6 100644 --- a/image/OrientedImage.cpp +++ b/image/OrientedImage.cpp @@ -66,10 +66,10 @@ OrientedImage::GetIntrinsicSize(nsSize* aSize) { return rv; } -AspectRatio OrientedImage::GetIntrinsicRatio() { - AspectRatio ratio = InnerImage()->GetIntrinsicRatio(); +Maybe OrientedImage::GetIntrinsicRatio() { + Maybe ratio = InnerImage()->GetIntrinsicRatio(); if (ratio && mOrientation.SwapsWidthAndHeight()) { - ratio = ratio.Inverted(); + ratio = Some(ratio->Inverted()); } return ratio; } diff --git a/image/OrientedImage.h b/image/OrientedImage.h index f74902b57ad9..e01fcd639cb5 100644 --- a/image/OrientedImage.h +++ b/image/OrientedImage.h @@ -31,7 +31,7 @@ class OrientedImage : public ImageWrapper { NS_IMETHOD GetHeight(int32_t* aHeight) override; nsresult GetNativeSizes(nsTArray& aNativeSizes) override; NS_IMETHOD GetIntrinsicSize(nsSize* aSize) override; - AspectRatio GetIntrinsicRatio() override; + Maybe GetIntrinsicRatio() override; NS_IMETHOD_(already_AddRefed) GetFrame(uint32_t aWhichFrame, uint32_t aFlags) override; NS_IMETHOD_(already_AddRefed) diff --git a/image/RasterImage.cpp b/image/RasterImage.cpp index d426beefdaa9..f8608d86cfe7 100644 --- a/image/RasterImage.cpp +++ b/image/RasterImage.cpp @@ -256,11 +256,12 @@ RasterImage::GetIntrinsicSize(nsSize* aSize) { } //****************************************************************************** -AspectRatio RasterImage::GetIntrinsicRatio() { +Maybe RasterImage::GetIntrinsicRatio() { if (mError) { - return {}; + return Nothing(); } - return AspectRatio::FromSize(mSize.width, mSize.height); + + return Some(AspectRatio::FromSize(mSize.width, mSize.height)); } NS_IMETHODIMP_(Orientation) diff --git a/image/SurfaceCache.cpp b/image/SurfaceCache.cpp index f97b32dfec80..cccbd505f5ee 100644 --- a/image/SurfaceCache.cpp +++ b/image/SurfaceCache.cpp @@ -596,9 +596,10 @@ class ImageSurfaceCache { // available. If our guess was too small, don't use factor-of-scaling. MOZ_ASSERT(mIsVectorImage); factorSize = IntSize(100, 100); - if (AspectRatio aspectRatio = image->GetIntrinsicRatio()) { + Maybe aspectRatio = image->GetIntrinsicRatio(); + if (aspectRatio && *aspectRatio) { factorSize.width = - NSToIntRound(aspectRatio.ApplyToFloat(float(factorSize.height))); + NSToIntRound(aspectRatio->ApplyToFloat(float(factorSize.height))); if (factorSize.IsEmpty()) { return aSize; } diff --git a/image/VectorImage.cpp b/image/VectorImage.cpp index dd9d17a4fa9e..11fb99082404 100644 --- a/image/VectorImage.cpp +++ b/image/VectorImage.cpp @@ -580,15 +580,17 @@ VectorImage::GetIntrinsicSize(nsSize* aSize) { } //****************************************************************************** -AspectRatio VectorImage::GetIntrinsicRatio() { +Maybe VectorImage::GetIntrinsicRatio() { if (mError || !mIsFullyLoaded) { - return {}; + return Nothing(); } + nsIFrame* rootFrame = mSVGDocumentWrapper->GetRootLayoutFrame(); if (!rootFrame) { - return {}; + return Nothing(); } - return rootFrame->GetIntrinsicRatio(); + + return Some(rootFrame->GetIntrinsicRatio()); } NS_IMETHODIMP_(Orientation) diff --git a/image/imgIContainer.idl b/image/imgIContainer.idl index 82396b80c7fa..abbc827878c0 100644 --- a/image/imgIContainer.idl +++ b/image/imgIContainer.idl @@ -21,12 +21,9 @@ webidl Document; #include "limits.h" class gfxContext; -class nsIFrame; namespace mozilla { -class TimeStamp; -class SVGImageContext; -struct MediaFeatureChange; +struct AspectRatio; namespace gfx { class SourceSurface; @@ -36,19 +33,31 @@ class WindowRenderer; namespace layers { class ImageContainer; } +} +class nsIFrame; + +namespace mozilla { +class TimeStamp; +class SVGImageContext; +struct MediaFeatureChange; +} + +namespace mozilla { namespace image { + class ImageRegion; class ImageIntRegion; class WebRenderImageProvider; struct Orientation; struct Resolution; + } } %} -native AspectRatio(mozilla::AspectRatio); +native MaybeAspectRatio(mozilla::Maybe); native ImgDrawResult(mozilla::image::ImgDrawResult); [ptr] native gfxContext(gfxContext); [ref] native gfxMatrix(gfxMatrix); @@ -106,11 +115,10 @@ interface imgIContainer : nsISupports [noscript] readonly attribute nsSize intrinsicSize; /** - * The (dimensionless) intrinsic ratio of this image. Might return a - * degenerate ratio (one that returns 'false' when coerced to a bool) - * if the image is in an error state, or there's no ratio. + * The (dimensionless) intrinsic ratio of this image. In the case of any + * error, Nothing() will be returned. */ - [notxpcom, nostdcall] readonly attribute AspectRatio intrinsicRatio; + [notxpcom, nostdcall] readonly attribute MaybeAspectRatio intrinsicRatio; /** * The x coordinate of the image's hotspot, or 0 if there is no hotspot. diff --git a/layout/base/nsLayoutUtils.cpp b/layout/base/nsLayoutUtils.cpp index 55a7da5ef950..d60a3b22a785 100644 --- a/layout/base/nsLayoutUtils.cpp +++ b/layout/base/nsLayoutUtils.cpp @@ -6215,7 +6215,8 @@ void nsLayoutUtils::ComputeSizeForDrawing( /* outparam */ bool& aGotHeight) { aGotWidth = NS_SUCCEEDED(aImage->GetWidth(&aImageSize.width)); aGotHeight = NS_SUCCEEDED(aImage->GetHeight(&aImageSize.height)); - aIntrinsicRatio = aImage->GetIntrinsicRatio(); + Maybe intrinsicRatio = aImage->GetIntrinsicRatio(); + aIntrinsicRatio = intrinsicRatio.valueOr(AspectRatio()); if (aGotWidth) { aResolution.ApplyXTo(aImageSize.width); @@ -6224,7 +6225,7 @@ void nsLayoutUtils::ComputeSizeForDrawing( aResolution.ApplyYTo(aImageSize.height); } - if (!(aGotWidth && aGotHeight) && !aIntrinsicRatio) { + if (!(aGotWidth && aGotHeight) && intrinsicRatio.isNothing()) { // We hit an error (say, because the image failed to load or couldn't be // decoded) and should return zero size. aGotWidth = aGotHeight = true; diff --git a/layout/generic/nsImageFrame.cpp b/layout/generic/nsImageFrame.cpp index 111b7b365118..5b25c60faa55 100644 --- a/layout/generic/nsImageFrame.cpp +++ b/layout/generic/nsImageFrame.cpp @@ -924,8 +924,8 @@ AspectRatio nsImageFrame::ComputeIntrinsicRatioForImage( } if (aImage) { - if (AspectRatio fromImage = aImage->GetIntrinsicRatio()) { - return fromImage; + if (Maybe fromImage = aImage->GetIntrinsicRatio()) { + return *fromImage; } } if (ShouldUseMappedAspectRatio()) { diff --git a/layout/svg/SVGImageFrame.cpp b/layout/svg/SVGImageFrame.cpp index df9fb2478bfd..5ffa26e9624a 100644 --- a/layout/svg/SVGImageFrame.cpp +++ b/layout/svg/SVGImageFrame.cpp @@ -249,6 +249,7 @@ bool SVGImageFrame::GetIntrinsicImageDimensions( } ImageResolution resolution = mImageContainer->GetResolution(); + int32_t width, height; if (NS_FAILED(mImageContainer->GetWidth(&width))) { aSize.width = -1; @@ -264,7 +265,9 @@ bool SVGImageFrame::GetIntrinsicImageDimensions( resolution.ApplyYTo(aSize.height); } - aAspectRatio = mImageContainer->GetIntrinsicRatio(); + Maybe asp = mImageContainer->GetIntrinsicRatio(); + aAspectRatio = asp.valueOr(AspectRatio{}); + return true; } diff --git a/widget/cocoa/nsCocoaUtils.mm b/widget/cocoa/nsCocoaUtils.mm index 55891c48a53b..791532122461 100644 --- a/widget/cocoa/nsCocoaUtils.mm +++ b/widget/cocoa/nsCocoaUtils.mm @@ -515,16 +515,16 @@ nsresult nsCocoaUtils::CreateNSImageFromImageContainer( { const bool gotWidth = NS_SUCCEEDED(aImage->GetWidth(&width)); const bool gotHeight = NS_SUCCEEDED(aImage->GetHeight(&height)); - if (auto ratio = aImage->GetIntrinsicRatio()) { + if (auto ratio = aImage->GetIntrinsicRatio(); ratio && *ratio) { if (gotWidth != gotHeight) { if (gotWidth) { - height = ratio.Inverted().ApplyTo(width); + height = ratio->Inverted().ApplyTo(width); } else { - width = ratio.ApplyTo(height); + width = ratio->ApplyTo(height); } } else if (!gotWidth) { height = std::ceil(aPreferredSize.height); - width = ratio.ApplyTo(height); + width = ratio->ApplyTo(height); } } }