Bug 1368776 - Part 11. Add ImageResource::GetImageContainerSize to determine the appropriate size for a requested container. r=tnikkel

This commit is contained in:
Andrew Osmond
2017-11-17 06:45:26 -05:00
parent 5202edf295
commit 4a14091623
4 changed files with 39 additions and 4 deletions

View File

@@ -108,7 +108,8 @@ ImageResource::GetImageContainerImpl(LayerManager* aManager,
== FLAG_NONE, == FLAG_NONE,
"Unsupported flag passed to GetImageContainer"); "Unsupported flag passed to GetImageContainer");
if (!IsImageContainerAvailable(aManager, aFlags)) { IntSize size = GetImageContainerSize(aManager, aSize, aFlags);
if (size.IsEmpty()) {
return nullptr; return nullptr;
} }
@@ -122,7 +123,7 @@ ImageResource::GetImageContainerImpl(LayerManager* aManager,
for (; i >= 0; --i) { for (; i >= 0; --i) {
entry = &mImageContainers[i]; entry = &mImageContainers[i];
container = entry->mContainer.get(); container = entry->mContainer.get();
if (aSize == entry->mSize) { if (size == entry->mSize) {
// Lack of a container is handled below. // Lack of a container is handled below.
break; break;
} else if (!container) { } else if (!container) {
@@ -156,7 +157,7 @@ ImageResource::GetImageContainerImpl(LayerManager* aManager,
entry->mContainer = container; entry->mContainer = container;
} else { } else {
entry = mImageContainers.AppendElement( entry = mImageContainers.AppendElement(
ImageContainerEntry(aSize, container.get())); ImageContainerEntry(size, container.get()));
} }
} }
@@ -165,7 +166,7 @@ ImageResource::GetImageContainerImpl(LayerManager* aManager,
#endif #endif
entry->mLastDrawResult = entry->mLastDrawResult =
AddCurrentImage(container, aSize, aFlags, true); AddCurrentImage(container, size, aFlags, true);
return container.forget(); return container.forget();
} }

View File

@@ -344,6 +344,19 @@ protected:
return MakePair(DrawResult::BAD_IMAGE, RefPtr<gfx::SourceSurface>()); 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> already_AddRefed<layers::ImageContainer>
GetImageContainerImpl(layers::LayerManager* aManager, GetImageContainerImpl(layers::LayerManager* aManager,
const gfx::IntSize& aSize, const gfx::IntSize& aSize,

View File

@@ -620,6 +620,22 @@ RasterImage::GetFrameInternal(const IntSize& aSize,
return MakePair(DrawResult::SUCCESS, Move(sourceSurface)); 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) NS_IMETHODIMP_(bool)
RasterImage::IsImageContainerAvailable(LayerManager* aManager, uint32_t aFlags) RasterImage::IsImageContainerAvailable(LayerManager* aManager, uint32_t aFlags)
{ {

View File

@@ -131,6 +131,7 @@ namespace mozilla {
namespace layers { namespace layers {
class ImageContainer; class ImageContainer;
class Image; class Image;
class LayersManager;
} // namespace layers } // namespace layers
namespace image { namespace image {
@@ -312,6 +313,10 @@ private:
uint32_t aWhichFrame, uint32_t aWhichFrame,
uint32_t aFlags) override; uint32_t aFlags) override;
gfx::IntSize GetImageContainerSize(layers::LayerManager* aManager,
const gfx::IntSize& aSize,
uint32_t aFlags) override;
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////
// Decoding. // Decoding.
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////