Bug 815593. Don't layerize images that exceed MaxTextureSize. r=mattwoodrow

--HG--
extra : rebase_source : f94300b24b90d063df095324663c9d8fa49e42e9
This commit is contained in:
Robert O'Callahan 2012-11-28 15:34:45 +13:00
Родитель 528576f042
Коммит 01b72b4b81
15 изменённых файлов: 78 добавлений и 31 удалений

Просмотреть файл

@ -57,7 +57,7 @@ native gfxGraphicsFilter(gfxPattern::GraphicsFilter);
* *
* Internally, imgIContainer also manages animation of images. * Internally, imgIContainer also manages animation of images.
*/ */
[scriptable, uuid(d6c58749-ceb6-4afe-ab72-ff3086433e1f)] [scriptable, uuid(01e12ac9-7d9f-40d9-9ec1-70b64c53ce7a)]
interface imgIContainer : nsISupports interface imgIContainer : nsISupports
{ {
/** /**
@ -158,7 +158,7 @@ interface imgIContainer : nsISupports
* Attempts to create an ImageContainer (and Image) containing the current * Attempts to create an ImageContainer (and Image) containing the current
* frame. Only valid for RASTER type images. * frame. Only valid for RASTER type images.
*/ */
[noscript] ImageContainer getImageContainer(); [noscript] ImageContainer getImageContainer(in LayerManager aManager);
/** /**
* Create and return a new copy of the given frame that you can write to * Create and return a new copy of the given frame that you can write to

Просмотреть файл

@ -1114,8 +1114,14 @@ RasterImage::GetCurrentImage()
NS_IMETHODIMP NS_IMETHODIMP
RasterImage::GetImageContainer(ImageContainer **_retval) RasterImage::GetImageContainer(LayerManager* aManager, ImageContainer **_retval)
{ {
int32_t maxTextureSize = aManager->GetMaxTextureSize();
if (mSize.width > maxTextureSize || mSize.height > maxTextureSize) {
*_retval = nullptr;
return NS_OK;
}
if (mImageContainer) { if (mImageContainer) {
*_retval = mImageContainer; *_retval = mImageContainer;
NS_ADDREF(*_retval); NS_ADDREF(*_retval);

Просмотреть файл

@ -25,6 +25,7 @@
namespace mozilla { namespace mozilla {
using namespace dom; using namespace dom;
using namespace layers;
namespace image { namespace image {
@ -383,7 +384,8 @@ VectorImage::GetFrame(uint32_t aWhichFrame,
//****************************************************************************** //******************************************************************************
/* [noscript] ImageContainer getImageContainer(); */ /* [noscript] ImageContainer getImageContainer(); */
NS_IMETHODIMP NS_IMETHODIMP
VectorImage::GetImageContainer(mozilla::layers::ImageContainer** _retval) VectorImage::GetImageContainer(LayerManager* aManager,
mozilla::layers::ImageContainer** _retval)
{ {
*_retval = nullptr; *_retval = nullptr;
return NS_OK; return NS_OK;

Просмотреть файл

@ -1534,7 +1534,7 @@ ContainerState::ThebesLayerData::CanOptimizeImageLayer(nsDisplayListBuilder* aBu
return nullptr; return nullptr;
} }
return mImage->GetContainer(aBuilder); return mImage->GetContainer(mLayer->Manager(), aBuilder);
} }
void void

Просмотреть файл

@ -4696,7 +4696,7 @@ nsImageRenderer::IsRasterImage()
} }
already_AddRefed<mozilla::layers::ImageContainer> already_AddRefed<mozilla::layers::ImageContainer>
nsImageRenderer::GetContainer() nsImageRenderer::GetContainer(LayerManager* aManager)
{ {
if (mType != eStyleImageType_Image) if (mType != eStyleImageType_Image)
return nullptr; return nullptr;
@ -4704,8 +4704,9 @@ nsImageRenderer::GetContainer()
nsresult rv = mImage->GetImageData()->GetImage(getter_AddRefs(img)); nsresult rv = mImage->GetImageData()->GetImage(getter_AddRefs(img));
if (NS_FAILED(rv)) if (NS_FAILED(rv))
return nullptr; return nullptr;
nsRefPtr<ImageContainer> container; nsRefPtr<ImageContainer> container;
rv = img->GetImageContainer(getter_AddRefs(container)); rv = img->GetImageContainer(aManager, getter_AddRefs(container));
NS_ENSURE_SUCCESS(rv, nullptr); NS_ENSURE_SUCCESS(rv, nullptr);
return container.forget(); return container.forget();
} }

Просмотреть файл

@ -29,6 +29,7 @@ class nsRenderingContext;
*/ */
class nsImageRenderer { class nsImageRenderer {
public: public:
typedef mozilla::layers::LayerManager LayerManager;
typedef mozilla::layers::ImageContainer ImageContainer; typedef mozilla::layers::ImageContainer ImageContainer;
enum { enum {
@ -60,9 +61,9 @@ public:
const nsPoint& aAnchor, const nsPoint& aAnchor,
const nsRect& aDirty); const nsRect& aDirty);
bool IsRasterImage(); bool IsRasterImage();
already_AddRefed<ImageContainer> GetContainer(); already_AddRefed<ImageContainer> GetContainer(LayerManager* aManager);
private: private:
/* /*
* Compute the "unscaled" dimensions of the image in aUnscaled{Width,Height} * Compute the "unscaled" dimensions of the image in aUnscaled{Width,Height}

Просмотреть файл

@ -1723,7 +1723,8 @@ nsDisplayBackgroundImage::IsSingleFixedPositionImage(nsDisplayListBuilder* aBuil
} }
bool bool
nsDisplayBackgroundImage::TryOptimizeToImageLayer(nsDisplayListBuilder* aBuilder) nsDisplayBackgroundImage::TryOptimizeToImageLayer(LayerManager* aManager,
nsDisplayListBuilder* aBuilder)
{ {
if (mIsThemed || !mBackgroundStyle) if (mIsThemed || !mBackgroundStyle)
return false; return false;
@ -1747,7 +1748,7 @@ nsDisplayBackgroundImage::TryOptimizeToImageLayer(nsDisplayListBuilder* aBuilder
if (!imageRenderer->IsRasterImage()) if (!imageRenderer->IsRasterImage())
return false; return false;
nsRefPtr<ImageContainer> imageContainer = imageRenderer->GetContainer(); nsRefPtr<ImageContainer> imageContainer = imageRenderer->GetContainer(aManager);
// Image is not ready to be made into a layer yet // Image is not ready to be made into a layer yet
if (!imageContainer) if (!imageContainer)
return false; return false;
@ -1771,9 +1772,10 @@ nsDisplayBackgroundImage::TryOptimizeToImageLayer(nsDisplayListBuilder* aBuilder
} }
already_AddRefed<ImageContainer> already_AddRefed<ImageContainer>
nsDisplayBackgroundImage::GetContainer(nsDisplayListBuilder *aBuilder) nsDisplayBackgroundImage::GetContainer(LayerManager* aManager,
nsDisplayListBuilder *aBuilder)
{ {
if (!TryOptimizeToImageLayer(aBuilder)) { if (!TryOptimizeToImageLayer(aManager, aBuilder)) {
return nullptr; return nullptr;
} }
@ -1789,7 +1791,7 @@ nsDisplayBackgroundImage::GetLayerState(nsDisplayListBuilder* aBuilder,
{ {
if (!aManager->IsCompositingCheap() || if (!aManager->IsCompositingCheap() ||
!nsLayoutUtils::GPUImageScalingEnabled() || !nsLayoutUtils::GPUImageScalingEnabled() ||
!TryOptimizeToImageLayer(aBuilder)) { !TryOptimizeToImageLayer(aManager, aBuilder)) {
return LAYER_NONE; return LAYER_NONE;
} }
@ -1806,12 +1808,12 @@ nsDisplayBackgroundImage::GetLayerState(nsDisplayListBuilder* aBuilder,
// If we are not scaling at all, no point in separating this into a layer. // If we are not scaling at all, no point in separating this into a layer.
if (scale.width == 1.0f && scale.height == 1.0f) { if (scale.width == 1.0f && scale.height == 1.0f) {
return LAYER_INACTIVE; return LAYER_NONE;
} }
// If the target size is pretty small, no point in using a layer. // If the target size is pretty small, no point in using a layer.
if (destRect.width * destRect.height < 64 * 64) { if (destRect.width * destRect.height < 64 * 64) {
return LAYER_INACTIVE; return LAYER_NONE;
} }
return LAYER_ACTIVE; return LAYER_ACTIVE;

Просмотреть файл

@ -1560,7 +1560,8 @@ public:
: nsDisplayItem(aBuilder, aFrame) : nsDisplayItem(aBuilder, aFrame)
{} {}
virtual already_AddRefed<ImageContainer> GetContainer(nsDisplayListBuilder* aBuilder) = 0; virtual already_AddRefed<ImageContainer> GetContainer(LayerManager* aManager,
nsDisplayListBuilder* aBuilder) = 0;
virtual void ConfigureLayer(ImageLayer* aLayer, const nsIntPoint& aOffset) = 0; virtual void ConfigureLayer(ImageLayer* aLayer, const nsIntPoint& aOffset) = 0;
virtual bool SupportsOptimizingToImage() { return true; } virtual bool SupportsOptimizingToImage() { return true; }
@ -1886,7 +1887,8 @@ public:
const nsDisplayItemGeometry* aGeometry, const nsDisplayItemGeometry* aGeometry,
nsRegion* aInvalidRegion) MOZ_OVERRIDE; nsRegion* aInvalidRegion) MOZ_OVERRIDE;
virtual already_AddRefed<ImageContainer> GetContainer(nsDisplayListBuilder *aBuilder) MOZ_OVERRIDE; virtual already_AddRefed<ImageContainer> GetContainer(LayerManager* aManager,
nsDisplayListBuilder *aBuilder) MOZ_OVERRIDE;
virtual void ConfigureLayer(ImageLayer* aLayer, const nsIntPoint& aOffset) MOZ_OVERRIDE; virtual void ConfigureLayer(ImageLayer* aLayer, const nsIntPoint& aOffset) MOZ_OVERRIDE;
static nsRegion GetInsideClipRegion(nsDisplayItem* aItem, nsPresContext* aPresContext, uint8_t aClip, static nsRegion GetInsideClipRegion(nsDisplayItem* aItem, nsPresContext* aPresContext, uint8_t aClip,
@ -1895,7 +1897,7 @@ protected:
typedef class mozilla::layers::ImageContainer ImageContainer; typedef class mozilla::layers::ImageContainer ImageContainer;
typedef class mozilla::layers::ImageLayer ImageLayer; typedef class mozilla::layers::ImageLayer ImageLayer;
bool TryOptimizeToImageLayer(nsDisplayListBuilder* aBuilder); bool TryOptimizeToImageLayer(LayerManager* aManager, nsDisplayListBuilder* aBuilder);
bool IsSingleFixedPositionImage(nsDisplayListBuilder* aBuilder, bool IsSingleFixedPositionImage(nsDisplayListBuilder* aBuilder,
const nsRect& aClipRect, const nsRect& aClipRect,
gfxRect* aDestRect); gfxRect* aDestRect);

Просмотреть файл

@ -1229,10 +1229,11 @@ nsDisplayImage::Paint(nsDisplayListBuilder* aBuilder,
} }
already_AddRefed<ImageContainer> already_AddRefed<ImageContainer>
nsDisplayImage::GetContainer(nsDisplayListBuilder* aBuilder) nsDisplayImage::GetContainer(LayerManager* aManager,
nsDisplayListBuilder* aBuilder)
{ {
nsRefPtr<ImageContainer> container; nsRefPtr<ImageContainer> container;
nsresult rv = mImage->GetImageContainer(getter_AddRefs(container)); nsresult rv = mImage->GetImageContainer(aManager, getter_AddRefs(container));
NS_ENSURE_SUCCESS(rv, nullptr); NS_ENSURE_SUCCESS(rv, nullptr);
return container.forget(); return container.forget();
} }
@ -1278,12 +1279,18 @@ nsDisplayImage::GetLayerState(nsDisplayListBuilder* aBuilder,
// If we are not scaling at all, no point in separating this into a layer. // If we are not scaling at all, no point in separating this into a layer.
if (scale.width == 1.0f && scale.height == 1.0f) { if (scale.width == 1.0f && scale.height == 1.0f) {
return LAYER_INACTIVE; return LAYER_NONE;
} }
// If the target size is pretty small, no point in using a layer. // If the target size is pretty small, no point in using a layer.
if (destRect.width * destRect.height < 64 * 64) { if (destRect.width * destRect.height < 64 * 64) {
return LAYER_INACTIVE; return LAYER_NONE;
}
nsRefPtr<ImageContainer> container;
nsresult rv = mImage->GetImageContainer(aManager, getter_AddRefs(container));
if (!container) {
return LAYER_NONE;
} }
return LAYER_ACTIVE; return LAYER_ACTIVE;
@ -1295,7 +1302,7 @@ nsDisplayImage::BuildLayer(nsDisplayListBuilder* aBuilder,
const ContainerParameters& aParameters) const ContainerParameters& aParameters)
{ {
nsRefPtr<ImageContainer> container; nsRefPtr<ImageContainer> container;
nsresult rv = mImage->GetImageContainer(getter_AddRefs(container)); nsresult rv = mImage->GetImageContainer(aManager, getter_AddRefs(container));
NS_ENSURE_SUCCESS(rv, nullptr); NS_ENSURE_SUCCESS(rv, nullptr);
nsRefPtr<ImageLayer> layer = aManager->CreateImageLayer(); nsRefPtr<ImageLayer> layer = aManager->CreateImageLayer();

Просмотреть файл

@ -370,7 +370,8 @@ public:
* Returns an ImageContainer for this image if the image type * Returns an ImageContainer for this image if the image type
* supports it (TYPE_RASTER only). * supports it (TYPE_RASTER only).
*/ */
virtual already_AddRefed<ImageContainer> GetContainer(nsDisplayListBuilder* aBuilder) MOZ_OVERRIDE; virtual already_AddRefed<ImageContainer> GetContainer(LayerManager* aManager,
nsDisplayListBuilder* aBuilder) MOZ_OVERRIDE;
gfxRect GetDestRect(); gfxRect GetDestRect();

Просмотреть файл

@ -0,0 +1,6 @@
<!DOCTYPE HTML>
<html>
<body>
<img style="transform:translate(20px,0)" id="i" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAE4gCAYAAAA/MefJAAAJaklEQVR4nO3KQREAAAwCIPuX1ghbAI4vSZ9EURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRF8TbU+MCtlWtcNAAAAABJRU5ErkJggg==">
</body>
</html>

Просмотреть файл

@ -0,0 +1,15 @@
<!DOCTYPE HTML>
<html class="reftest-wait">
<body>
<img id="i" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAE4gCAYAAAA/MefJAAAJaklEQVR4nO3KQREAAAwCIPuX1ghbAI4vSZ9EURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRFURRF8TbU+MCtlWtcNAAAAABJRU5ErkJggg==">
<script>
var i = document.getElementById("i");
i.getBoundingClientRect();
i.style.transform = "translate(10px,0)";
window.addEventListener("MozReftestInvalidate", function() {
i.style.transform = "translate(20px,0)";
document.documentElement.removeAttribute("class");
}, false);
</script>
</body>
</html>

Просмотреть файл

@ -1732,3 +1732,4 @@ fuzzy(40,800) == 797797-2.html 797797-2-ref.html # 'opacity:N' and rgba(,,,N) te
== 804323-1.html 804323-1-ref.html == 804323-1.html 804323-1-ref.html
== 811301-1.html 811301-1-ref.html == 811301-1.html 811301-1-ref.html
== 812824-1.html 812824-1-ref.html == 812824-1.html 812824-1-ref.html
== 815593-1.html 815593-1-ref.html

Просмотреть файл

@ -388,13 +388,13 @@ nsDisplayXULImage::ConfigureLayer(ImageLayer* aLayer, const nsIntPoint& aOffset)
} }
already_AddRefed<ImageContainer> already_AddRefed<ImageContainer>
nsDisplayXULImage::GetContainer(nsDisplayListBuilder* aBuilder) nsDisplayXULImage::GetContainer(LayerManager* aManager, nsDisplayListBuilder* aBuilder)
{ {
return static_cast<nsImageBoxFrame*>(mFrame)->GetContainer(); return static_cast<nsImageBoxFrame*>(mFrame)->GetContainer(aManager);
} }
already_AddRefed<ImageContainer> already_AddRefed<ImageContainer>
nsImageBoxFrame::GetContainer() nsImageBoxFrame::GetContainer(LayerManager* aManager)
{ {
bool hasSubRect = !mUseSrcAttr && (mSubRect.width > 0 || mSubRect.height > 0); bool hasSubRect = !mUseSrcAttr && (mSubRect.width > 0 || mSubRect.height > 0);
if (hasSubRect || !mImageRequest) { if (hasSubRect || !mImageRequest) {
@ -408,7 +408,7 @@ nsImageBoxFrame::GetContainer()
} }
nsRefPtr<ImageContainer> container; nsRefPtr<ImageContainer> container;
nsresult rv = imgCon->GetImageContainer(getter_AddRefs(container)); nsresult rv = imgCon->GetImageContainer(aManager, getter_AddRefs(container));
NS_ENSURE_SUCCESS(rv, nullptr); NS_ENSURE_SUCCESS(rv, nullptr);
return container.forget(); return container.forget();
} }

Просмотреть файл

@ -35,6 +35,8 @@ private:
class nsImageBoxFrame : public nsLeafBoxFrame class nsImageBoxFrame : public nsLeafBoxFrame
{ {
public: public:
typedef mozilla::layers::LayerManager LayerManager;
friend class nsDisplayXULImage; friend class nsDisplayXULImage;
NS_DECL_FRAMEARENA_HELPERS NS_DECL_FRAMEARENA_HELPERS
@ -87,7 +89,7 @@ public:
const nsRect& aDirtyRect, const nsRect& aDirtyRect,
nsPoint aPt, uint32_t aFlags); nsPoint aPt, uint32_t aFlags);
already_AddRefed<mozilla::layers::ImageContainer> GetContainer(); already_AddRefed<mozilla::layers::ImageContainer> GetContainer(LayerManager* aManager);
protected: protected:
nsImageBoxFrame(nsIPresShell* aShell, nsStyleContext* aContext); nsImageBoxFrame(nsIPresShell* aShell, nsStyleContext* aContext);
@ -130,7 +132,8 @@ public:
} }
#endif #endif
virtual already_AddRefed<ImageContainer> GetContainer(nsDisplayListBuilder* aBuilder) MOZ_OVERRIDE; virtual already_AddRefed<ImageContainer> GetContainer(LayerManager* aManager,
nsDisplayListBuilder* aBuilder) MOZ_OVERRIDE;
virtual void ConfigureLayer(ImageLayer* aLayer, const nsIntPoint& aOffset) MOZ_OVERRIDE; virtual void ConfigureLayer(ImageLayer* aLayer, const nsIntPoint& aOffset) MOZ_OVERRIDE;
virtual nsRect GetBounds(nsDisplayListBuilder* aBuilder, bool* aSnap) virtual nsRect GetBounds(nsDisplayListBuilder* aBuilder, bool* aSnap)
{ {