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,
|
== 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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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.
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
|
|||||||
Reference in New Issue
Block a user