Bug 1360112 - Correct background image position when enabling webrender background image. r=mattwoodrow

This commit is contained in:
Ethan Lin 2017-05-01 00:59:26 +08:00
Родитель 59b75a786f
Коммит f29e1a70ba
3 изменённых файлов: 23 добавлений и 5 удалений

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

@ -6733,6 +6733,16 @@ nsLayoutUtils::ComputeSizeForDrawingWithFallback(imgIContainer* aImage,
return imageSize;
}
/* static */ nsPoint
nsLayoutUtils::GetBackgroundFirstTilePos(const nsPoint& aDest,
const nsPoint& aFill,
const nsSize& aRepeatSize)
{
return nsPoint(NSToIntFloor(float(aFill.x - aDest.x) / aRepeatSize.width) * aRepeatSize.width,
NSToIntFloor(float(aFill.y - aDest.y) / aRepeatSize.height) * aRepeatSize.height) +
aDest;
}
/* static */ DrawResult
nsLayoutUtils::DrawBackgroundImage(gfxContext& aContext,
nsIFrame* aForFrame,
@ -6763,9 +6773,7 @@ nsLayoutUtils::DrawBackgroundImage(gfxContext& aContext,
aOpacity);
}
nsPoint firstTilePos = aDest.TopLeft() +
nsPoint(NSToIntFloor(float(aFill.x - aDest.x) / aRepeatSize.width) * aRepeatSize.width,
NSToIntFloor(float(aFill.y - aDest.y) / aRepeatSize.height) * aRepeatSize.height);
nsPoint firstTilePos = GetBackgroundFirstTilePos(aDest.TopLeft(), aFill.TopLeft(), aRepeatSize);
for (int32_t i = firstTilePos.x; i < aFill.XMost(); i += aRepeatSize.width) {
for (int32_t j = firstTilePos.y; j < aFill.YMost(); j += aRepeatSize.height) {
nsRect dest(i, j, aDest.width, aDest.height);

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

@ -1605,6 +1605,10 @@ public:
nsStyleContext* aStyleContext = nullptr,
DrawStringFlags aFlags = DrawStringFlags::eDefault);
static nsPoint GetBackgroundFirstTilePos(const nsPoint& aDest,
const nsPoint& aFill,
const nsSize& aRepeatSize);
/**
* Supports only LTR or RTL. Bidi (mixed direction) is not supported.
*/

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

@ -625,11 +625,17 @@ nsImageRenderer::BuildWebRenderDisplayItems(nsPresContext* aPresContext,
aDest, appUnitsPerDevPixel);
LayerRect dest = aLayer->RelativeToParent(destRect);
nsPoint firstTilePos = nsLayoutUtils::GetBackgroundFirstTilePos(aDest.TopLeft(),
aFill.TopLeft(),
aRepeatSize);
LayoutDeviceRect fillRect = LayoutDeviceRect::FromAppUnits(
aFill, appUnitsPerDevPixel);
nsRect(firstTilePos.x, firstTilePos.y,
aFill.XMost() - firstTilePos.x, aFill.YMost() - firstTilePos.y),
appUnitsPerDevPixel);
LayerRect fill = aLayer->RelativeToParent(fillRect);
LayerRect clip = aLayer->RelativeToParent(
LayoutDeviceRect::FromAppUnits(aFill,appUnitsPerDevPixel));
LayerRect clip = fill;
Size gapSize((aRepeatSize.width - aDest.width) / appUnitsPerDevPixel,
(aRepeatSize.height - aDest.height) / appUnitsPerDevPixel);
aBuilder.PushImage(wr::ToWrRect(fill), aBuilder.BuildClipRegion(wr::ToWrRect(clip)),