Bug 1368776 - Part 11. Add ImageResource::GetImageContainerSize to determine the appropriate size for a requested container. r=tnikkel
This commit is contained in:
@@ -108,7 +108,8 @@ ImageResource::GetImageContainerImpl(LayerManager* aManager,
|
||||
== FLAG_NONE,
|
||||
"Unsupported flag passed to GetImageContainer");
|
||||
|
||||
if (!IsImageContainerAvailable(aManager, aFlags)) {
|
||||
IntSize size = GetImageContainerSize(aManager, aSize, aFlags);
|
||||
if (size.IsEmpty()) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
@@ -122,7 +123,7 @@ ImageResource::GetImageContainerImpl(LayerManager* aManager,
|
||||
for (; i >= 0; --i) {
|
||||
entry = &mImageContainers[i];
|
||||
container = entry->mContainer.get();
|
||||
if (aSize == entry->mSize) {
|
||||
if (size == entry->mSize) {
|
||||
// Lack of a container is handled below.
|
||||
break;
|
||||
} else if (!container) {
|
||||
@@ -156,7 +157,7 @@ ImageResource::GetImageContainerImpl(LayerManager* aManager,
|
||||
entry->mContainer = container;
|
||||
} else {
|
||||
entry = mImageContainers.AppendElement(
|
||||
ImageContainerEntry(aSize, container.get()));
|
||||
ImageContainerEntry(size, container.get()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -165,7 +166,7 @@ ImageResource::GetImageContainerImpl(LayerManager* aManager,
|
||||
#endif
|
||||
|
||||
entry->mLastDrawResult =
|
||||
AddCurrentImage(container, aSize, aFlags, true);
|
||||
AddCurrentImage(container, size, aFlags, true);
|
||||
return container.forget();
|
||||
}
|
||||
|
||||
|
||||
@@ -344,6 +344,19 @@ protected:
|
||||
return MakePair(DrawResult::BAD_IMAGE, RefPtr<gfx::SourceSurface>());
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculate the estimated size to use for an image container with the given
|
||||
* parameters. It may not be the same as the given size, and it may not be
|
||||
* the same as the size of the surface in the image container, but it is the
|
||||
* best effort estimate.
|
||||
*/
|
||||
virtual gfx::IntSize GetImageContainerSize(layers::LayerManager* aManager,
|
||||
const gfx::IntSize& aSize,
|
||||
uint32_t aFlags)
|
||||
{
|
||||
return gfx::IntSize(0, 0);
|
||||
}
|
||||
|
||||
already_AddRefed<layers::ImageContainer>
|
||||
GetImageContainerImpl(layers::LayerManager* aManager,
|
||||
const gfx::IntSize& aSize,
|
||||
|
||||
@@ -620,6 +620,22 @@ RasterImage::GetFrameInternal(const IntSize& aSize,
|
||||
return MakePair(DrawResult::SUCCESS, Move(sourceSurface));
|
||||
}
|
||||
|
||||
IntSize
|
||||
RasterImage::GetImageContainerSize(LayerManager* aManager,
|
||||
const IntSize& aSize,
|
||||
uint32_t aFlags)
|
||||
{
|
||||
if (!IsImageContainerAvailableAtSize(aManager, aSize, aFlags)) {
|
||||
return IntSize(0, 0);
|
||||
}
|
||||
|
||||
if (!CanDownscaleDuringDecode(aSize, aFlags)) {
|
||||
return mSize;
|
||||
}
|
||||
|
||||
return aSize;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP_(bool)
|
||||
RasterImage::IsImageContainerAvailable(LayerManager* aManager, uint32_t aFlags)
|
||||
{
|
||||
|
||||
@@ -131,6 +131,7 @@ namespace mozilla {
|
||||
namespace layers {
|
||||
class ImageContainer;
|
||||
class Image;
|
||||
class LayersManager;
|
||||
} // namespace layers
|
||||
|
||||
namespace image {
|
||||
@@ -312,6 +313,10 @@ private:
|
||||
uint32_t aWhichFrame,
|
||||
uint32_t aFlags) override;
|
||||
|
||||
gfx::IntSize GetImageContainerSize(layers::LayerManager* aManager,
|
||||
const gfx::IntSize& aSize,
|
||||
uint32_t aFlags) override;
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// Decoding.
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
Reference in New Issue
Block a user