Bug 1965114 part 2: Add a new imgIContainer.intrinsicSize attr as a shorthand for getting width & height. r=tnikkel
This is mostly just a convenience shorthand to avoid running the same boilerplate/error-checking code in the implementation of the 'width' and 'height' attributes, for the benefit of callers that need both sizes. But, beyond that convenience: this also lets us elegantly express the case where an image simply lacks an intrinsic width and/or height (not due to any error, but simply because it's e.g. an SVG that has no preferred size in either or both of its axes). This is a state we'll need to be able to detect and give special treatment to in a forthcoming patch for bug 1935269. Differential Revision: https://phabricator.services.mozilla.com/D248526
This commit is contained in:
committed by
dholbert@mozilla.com
parent
dda6b1197c
commit
a1b0d56c0a
@@ -195,6 +195,17 @@ ClippedImage::GetHeight(int32_t* aHeight) {
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
ClippedImage::GetIntrinsicSize(ImageIntrinsicSize* aIntrinsicSize) {
|
||||
if (!ShouldClip()) {
|
||||
return InnerImage()->GetIntrinsicSize(aIntrinsicSize);
|
||||
}
|
||||
|
||||
aIntrinsicSize->mWidth = Some(mClip.Width());
|
||||
aIntrinsicSize->mHeight = Some(mClip.Height());
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
ClippedImage::GetIntrinsicSizeInAppUnits(nsSize* aSize) {
|
||||
if (!ShouldClip()) {
|
||||
|
||||
@@ -35,6 +35,7 @@ class ClippedImage : public ImageWrapper {
|
||||
|
||||
NS_IMETHOD GetWidth(int32_t* aWidth) override;
|
||||
NS_IMETHOD GetHeight(int32_t* aHeight) override;
|
||||
NS_IMETHOD GetIntrinsicSize(ImageIntrinsicSize* aIntrinsicSize) override;
|
||||
NS_IMETHOD GetIntrinsicSizeInAppUnits(nsSize* aSize) override;
|
||||
AspectRatio GetIntrinsicRatio() override;
|
||||
NS_IMETHOD_(already_AddRefed<SourceSurface>)
|
||||
|
||||
@@ -97,6 +97,15 @@ nsresult DynamicImage::GetNativeSizes(nsTArray<IntSize>&) {
|
||||
|
||||
size_t DynamicImage::GetNativeSizesLength() { return 0; }
|
||||
|
||||
NS_IMETHODIMP
|
||||
DynamicImage::GetIntrinsicSize(ImageIntrinsicSize* aIntrinsicSize) {
|
||||
IntSize intSize(mDrawable->Size());
|
||||
aIntrinsicSize->mWidth = Some(intSize.width);
|
||||
aIntrinsicSize->mHeight = Some(intSize.height);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
DynamicImage::GetIntrinsicSizeInAppUnits(nsSize* aSize) {
|
||||
// XXXdholbert This probably needs to be scaled; see bug 1965106.
|
||||
|
||||
@@ -114,6 +114,11 @@ size_t ImageWrapper::GetNativeSizesLength() {
|
||||
return mInnerImage->GetNativeSizesLength();
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
ImageWrapper::GetIntrinsicSize(ImageIntrinsicSize* aIntrinsicSize) {
|
||||
return mInnerImage->GetIntrinsicSize(aIntrinsicSize);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
ImageWrapper::GetIntrinsicSizeInAppUnits(nsSize* aSize) {
|
||||
return mInnerImage->GetIntrinsicSizeInAppUnits(aSize);
|
||||
|
||||
@@ -207,6 +207,20 @@ RasterImage::GetHeight(int32_t* aHeight) {
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
//******************************************************************************
|
||||
NS_IMETHODIMP
|
||||
RasterImage::GetIntrinsicSize(ImageIntrinsicSize* aIntrinsicSize) {
|
||||
NS_ENSURE_ARG_POINTER(aIntrinsicSize);
|
||||
|
||||
if (mError) {
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
aIntrinsicSize->mWidth = Some(mSize.width);
|
||||
aIntrinsicSize->mHeight = Some(mSize.height);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
//******************************************************************************
|
||||
void RasterImage::MediaFeatureValuesChangedAllDocuments(
|
||||
const mozilla::MediaFeatureChange& aChange) {}
|
||||
|
||||
@@ -447,6 +447,7 @@ static Maybe<int32_t> ClampedPxLengthOrNothing(
|
||||
// imgIContainer methods
|
||||
|
||||
//******************************************************************************
|
||||
|
||||
NS_IMETHODIMP
|
||||
VectorImage::GetWidth(int32_t* aWidth) {
|
||||
if (mError || !mIsFullyLoaded) {
|
||||
@@ -507,6 +508,25 @@ VectorImage::GetHeight(int32_t* aHeight) {
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
//******************************************************************************
|
||||
NS_IMETHODIMP
|
||||
VectorImage::GetIntrinsicSize(ImageIntrinsicSize* aIntrinsicSize) {
|
||||
if (mError || !mIsFullyLoaded) {
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
SVGSVGElement* rootElem = mSVGDocumentWrapper->GetRootSVGElem();
|
||||
if (MOZ_UNLIKELY(!rootElem)) {
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
aIntrinsicSize->mWidth =
|
||||
ClampedPxLengthOrNothing(rootElem->GetIntrinsicWidth());
|
||||
aIntrinsicSize->mHeight =
|
||||
ClampedPxLengthOrNothing(rootElem->GetIntrinsicHeight());
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
//******************************************************************************
|
||||
NS_IMETHODIMP
|
||||
VectorImage::GetIntrinsicSizeInAppUnits(nsSize* aSize) {
|
||||
|
||||
@@ -43,12 +43,34 @@ class ImageIntRegion;
|
||||
class WebRenderImageProvider;
|
||||
struct Orientation;
|
||||
struct Resolution;
|
||||
|
||||
/**
|
||||
* This represents an image's intrinsic size, in units of pixels (the same
|
||||
* units as our 'width' and 'height' attributes). Both components are
|
||||
* optional, because an image (particularly a vector image) may lack an
|
||||
* intrinsic width and/or height.
|
||||
*
|
||||
* We use signed types for the components, but the values are expected to be
|
||||
* nonnegative; any negative values should be considered an error. (Zero is
|
||||
* valid, though.)
|
||||
*
|
||||
* Note that this is similar to a gfx::IntSize, except for the use of Maybe<>
|
||||
* to reflect that the components are optional. This is also similar to
|
||||
* nsIFrame.h's mozilla::IntrinsicSize class, with the difference being pixel
|
||||
* units here vs. nscoord units there.
|
||||
*/
|
||||
struct ImageIntrinsicSize {
|
||||
Maybe<int32_t> mWidth;
|
||||
Maybe<int32_t> mHeight;
|
||||
};
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
%}
|
||||
|
||||
native AspectRatio(mozilla::AspectRatio);
|
||||
native ImageIntrinsicSize(mozilla::image::ImageIntrinsicSize);
|
||||
native ImgDrawResult(mozilla::image::ImgDrawResult);
|
||||
[ptr] native gfxContext(gfxContext);
|
||||
[ref] native gfxMatrix(gfxMatrix);
|
||||
@@ -98,6 +120,20 @@ interface imgIContainer : nsISupports
|
||||
*/
|
||||
readonly attribute int32_t height;
|
||||
|
||||
/**
|
||||
* The intrinsic size of this image in pixels. The values and units here are
|
||||
* the same as those that the 'width' and 'height' attributes (declared
|
||||
* above) would return.
|
||||
*
|
||||
* If an image lacks an intrinsic width and/or height, then that component
|
||||
* will be Nothing() in the returned value. (This is different from the
|
||||
* 'width' and 'height' attributes; they treat this case as an error, for
|
||||
* historical reasons, but we can handle it more elegantly here.)
|
||||
*
|
||||
* In case of any error, an exception will be thrown.
|
||||
*/
|
||||
[noscript] readonly attribute ImageIntrinsicSize intrinsicSize;
|
||||
|
||||
/**
|
||||
* The intrinsic size of this image in appunits. If the image has no intrinsic
|
||||
* size in a dimension, -1 will be returned for that dimension. In the case of
|
||||
|
||||
Reference in New Issue
Block a user