mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Backout changeset eea5704272d0 (bug 539356) because of performance and correctness regressions
This commit is contained in:
parent
15926d8730
commit
7ca323fbe6
@ -1564,8 +1564,7 @@ DumpPaintedImage(nsDisplayItem* aItem, gfxASurface* aSurf)
|
|||||||
static void
|
static void
|
||||||
PaintInactiveLayer(nsDisplayListBuilder* aBuilder,
|
PaintInactiveLayer(nsDisplayListBuilder* aBuilder,
|
||||||
nsDisplayItem* aItem,
|
nsDisplayItem* aItem,
|
||||||
gfxContext* aContext,
|
gfxContext* aContext)
|
||||||
nsRenderingContext* aCtx)
|
|
||||||
{
|
{
|
||||||
// This item has an inactive layer. Render it to a ThebesLayer
|
// This item has an inactive layer. Render it to a ThebesLayer
|
||||||
// using a temporary BasicLayerManager.
|
// using a temporary BasicLayerManager.
|
||||||
@ -1596,11 +1595,7 @@ PaintInactiveLayer(nsDisplayListBuilder* aBuilder,
|
|||||||
|
|
||||||
tempManager->SetRoot(layer);
|
tempManager->SetRoot(layer);
|
||||||
aBuilder->LayerBuilder()->WillEndTransaction(tempManager);
|
aBuilder->LayerBuilder()->WillEndTransaction(tempManager);
|
||||||
if (aItem->GetType() == nsDisplayItem::TYPE_SVG_EFFECTS) {
|
tempManager->EndTransaction(FrameLayerBuilder::DrawThebesLayer, aBuilder);
|
||||||
static_cast<nsDisplaySVGEffects*>(aItem)->PaintAsLayer(aBuilder, aCtx, tempManager);
|
|
||||||
} else {
|
|
||||||
tempManager->EndTransaction(FrameLayerBuilder::DrawThebesLayer, aBuilder);
|
|
||||||
}
|
|
||||||
aBuilder->LayerBuilder()->DidEndTransaction(tempManager);
|
aBuilder->LayerBuilder()->DidEndTransaction(tempManager);
|
||||||
|
|
||||||
#ifdef MOZ_DUMP_PAINTING
|
#ifdef MOZ_DUMP_PAINTING
|
||||||
@ -2565,7 +2560,7 @@ FrameLayerBuilder::DrawThebesLayer(ThebesLayer* aLayer,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (cdi->mInactiveLayer) {
|
if (cdi->mInactiveLayer) {
|
||||||
PaintInactiveLayer(builder, cdi->mItem, aContext, rc);
|
PaintInactiveLayer(builder, cdi->mItem, aContext);
|
||||||
} else {
|
} else {
|
||||||
nsIFrame* frame = cdi->mItem->GetUnderlyingFrame();
|
nsIFrame* frame = cdi->mItem->GetUnderlyingFrame();
|
||||||
if (frame) {
|
if (frame) {
|
||||||
|
@ -29,9 +29,7 @@ enum LayerState {
|
|||||||
// when the layer has rounded rect clips.
|
// when the layer has rounded rect clips.
|
||||||
LAYER_ACTIVE_FORCE,
|
LAYER_ACTIVE_FORCE,
|
||||||
// Special layer that is metadata only.
|
// Special layer that is metadata only.
|
||||||
LAYER_ACTIVE_EMPTY,
|
LAYER_ACTIVE_EMPTY
|
||||||
// Inactive style layer for rendering SVG effects.
|
|
||||||
LAYER_SVG_EFFECTS
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -3256,52 +3256,11 @@ nsDisplaySVGEffects::HitTest(nsDisplayListBuilder* aBuilder, const nsRect& aRect
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void nsDisplaySVGEffects::Paint(nsDisplayListBuilder* aBuilder,
|
||||||
nsDisplaySVGEffects::PaintAsLayer(nsDisplayListBuilder* aBuilder,
|
nsRenderingContext* aCtx)
|
||||||
nsRenderingContext* aCtx,
|
|
||||||
LayerManager* aManager)
|
|
||||||
{
|
{
|
||||||
nsSVGIntegrationUtils::PaintFramesWithEffects(aCtx, mFrame,
|
nsSVGIntegrationUtils::PaintFramesWithEffects(aCtx,
|
||||||
mVisibleRect,
|
mFrame, mVisibleRect, aBuilder, &mList);
|
||||||
aBuilder, aManager);
|
|
||||||
}
|
|
||||||
|
|
||||||
LayerState
|
|
||||||
nsDisplaySVGEffects::GetLayerState(nsDisplayListBuilder* aBuilder,
|
|
||||||
LayerManager* aManager,
|
|
||||||
const ContainerParameters& aParameters)
|
|
||||||
{
|
|
||||||
return LAYER_SVG_EFFECTS;
|
|
||||||
}
|
|
||||||
|
|
||||||
already_AddRefed<Layer>
|
|
||||||
nsDisplaySVGEffects::BuildLayer(nsDisplayListBuilder* aBuilder,
|
|
||||||
LayerManager* aManager,
|
|
||||||
const ContainerParameters& aContainerParameters)
|
|
||||||
{
|
|
||||||
float opacity = mFrame->GetStyleDisplay()->mOpacity;
|
|
||||||
if (opacity == 0.0f)
|
|
||||||
return nsnull;
|
|
||||||
|
|
||||||
nsIFrame* firstFrame =
|
|
||||||
nsLayoutUtils::GetFirstContinuationOrSpecialSibling(mFrame);
|
|
||||||
nsSVGEffects::EffectProperties effectProperties =
|
|
||||||
nsSVGEffects::GetEffectProperties(firstFrame);
|
|
||||||
|
|
||||||
bool isOK = true;
|
|
||||||
nsSVGClipPathFrame *clipPathFrame = effectProperties.GetClipPathFrame(&isOK);
|
|
||||||
nsSVGMaskFrame *maskFrame = effectProperties.GetMaskFrame(&isOK);
|
|
||||||
nsSVGFilterFrame *filterFrame = effectProperties.GetFilterFrame(&isOK);
|
|
||||||
|
|
||||||
if (!isOK) {
|
|
||||||
return nsnull;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsRefPtr<ContainerLayer> container = aBuilder->LayerBuilder()->
|
|
||||||
BuildContainerLayerFor(aBuilder, aManager, mFrame, this, mList,
|
|
||||||
aContainerParameters, nsnull);
|
|
||||||
|
|
||||||
return container.forget();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool nsDisplaySVGEffects::ComputeVisibility(nsDisplayListBuilder* aBuilder,
|
bool nsDisplaySVGEffects::ComputeVisibility(nsDisplayListBuilder* aBuilder,
|
||||||
|
@ -2173,24 +2173,13 @@ public:
|
|||||||
*aSnap = false;
|
*aSnap = false;
|
||||||
return mEffectsBounds + ToReferenceFrame();
|
return mEffectsBounds + ToReferenceFrame();
|
||||||
}
|
}
|
||||||
|
virtual void Paint(nsDisplayListBuilder* aBuilder, nsRenderingContext* aCtx);
|
||||||
virtual bool ComputeVisibility(nsDisplayListBuilder* aBuilder,
|
virtual bool ComputeVisibility(nsDisplayListBuilder* aBuilder,
|
||||||
nsRegion* aVisibleRegion,
|
nsRegion* aVisibleRegion,
|
||||||
const nsRect& aAllowVisibleRegionExpansion);
|
const nsRect& aAllowVisibleRegionExpansion);
|
||||||
virtual bool TryMerge(nsDisplayListBuilder* aBuilder, nsDisplayItem* aItem);
|
virtual bool TryMerge(nsDisplayListBuilder* aBuilder, nsDisplayItem* aItem);
|
||||||
NS_DISPLAY_DECL_NAME("SVGEffects", TYPE_SVG_EFFECTS)
|
NS_DISPLAY_DECL_NAME("SVGEffects", TYPE_SVG_EFFECTS)
|
||||||
|
|
||||||
virtual LayerState GetLayerState(nsDisplayListBuilder* aBuilder,
|
|
||||||
LayerManager* aManager,
|
|
||||||
const ContainerParameters& aParameters);
|
|
||||||
|
|
||||||
virtual already_AddRefed<Layer> BuildLayer(nsDisplayListBuilder* aBuilder,
|
|
||||||
LayerManager* aManager,
|
|
||||||
const ContainerParameters& aContainerParameters);
|
|
||||||
|
|
||||||
void PaintAsLayer(nsDisplayListBuilder* aBuilder,
|
|
||||||
nsRenderingContext* aCtx,
|
|
||||||
LayerManager* aManager);
|
|
||||||
|
|
||||||
#ifdef MOZ_DUMP_PAINTING
|
#ifdef MOZ_DUMP_PAINTING
|
||||||
void PrintEffects(FILE* aOutput);
|
void PrintEffects(FILE* aOutput);
|
||||||
#endif
|
#endif
|
||||||
|
@ -18,11 +18,6 @@
|
|||||||
#include "nsSVGMaskFrame.h"
|
#include "nsSVGMaskFrame.h"
|
||||||
#include "nsSVGPaintServerFrame.h"
|
#include "nsSVGPaintServerFrame.h"
|
||||||
#include "nsSVGUtils.h"
|
#include "nsSVGUtils.h"
|
||||||
#include "FrameLayerBuilder.h"
|
|
||||||
#include "BasicLayers.h"
|
|
||||||
|
|
||||||
using namespace mozilla;
|
|
||||||
using namespace mozilla::layers;
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------
|
// ----------------------------------------------------------------------
|
||||||
|
|
||||||
@ -346,23 +341,23 @@ class RegularFramePaintCallback : public nsSVGFilterPaintCallback
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
RegularFramePaintCallback(nsDisplayListBuilder* aBuilder,
|
RegularFramePaintCallback(nsDisplayListBuilder* aBuilder,
|
||||||
LayerManager* aManager,
|
nsDisplayList* aInnerList,
|
||||||
|
nsIFrame* aFrame,
|
||||||
const nsPoint& aOffset)
|
const nsPoint& aOffset)
|
||||||
: mBuilder(aBuilder), mLayerManager(aManager),
|
: mBuilder(aBuilder), mInnerList(aInnerList), mFrame(aFrame),
|
||||||
mOffset(aOffset) {}
|
mOffset(aOffset) {}
|
||||||
|
|
||||||
virtual void Paint(nsRenderingContext *aContext, nsIFrame *aTarget,
|
virtual void Paint(nsRenderingContext *aContext, nsIFrame *aTarget,
|
||||||
const nsIntRect* aDirtyRect)
|
const nsIntRect* aDirtyRect)
|
||||||
{
|
{
|
||||||
BasicLayerManager* basic = static_cast<BasicLayerManager*>(mLayerManager);
|
|
||||||
basic->SetTarget(aContext->ThebesContext());
|
|
||||||
nsRenderingContext::AutoPushTranslation push(aContext, -mOffset);
|
nsRenderingContext::AutoPushTranslation push(aContext, -mOffset);
|
||||||
mLayerManager->EndTransaction(FrameLayerBuilder::DrawThebesLayer, mBuilder);
|
mInnerList->PaintForFrame(mBuilder, aContext, mFrame, nsDisplayList::PAINT_DEFAULT);
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
nsDisplayListBuilder* mBuilder;
|
nsDisplayListBuilder* mBuilder;
|
||||||
LayerManager* mLayerManager;
|
nsDisplayList* mInnerList;
|
||||||
|
nsIFrame* mFrame;
|
||||||
nsPoint mOffset;
|
nsPoint mOffset;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -371,7 +366,7 @@ nsSVGIntegrationUtils::PaintFramesWithEffects(nsRenderingContext* aCtx,
|
|||||||
nsIFrame* aFrame,
|
nsIFrame* aFrame,
|
||||||
const nsRect& aDirtyRect,
|
const nsRect& aDirtyRect,
|
||||||
nsDisplayListBuilder* aBuilder,
|
nsDisplayListBuilder* aBuilder,
|
||||||
LayerManager *aLayerManager)
|
nsDisplayList* aInnerList)
|
||||||
{
|
{
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
nsISVGChildFrame *svgChildFrame = do_QueryFrame(aFrame);
|
nsISVGChildFrame *svgChildFrame = do_QueryFrame(aFrame);
|
||||||
@ -447,13 +442,14 @@ nsSVGIntegrationUtils::PaintFramesWithEffects(nsRenderingContext* aCtx,
|
|||||||
|
|
||||||
/* Paint the child */
|
/* Paint the child */
|
||||||
if (filterFrame) {
|
if (filterFrame) {
|
||||||
RegularFramePaintCallback callback(aBuilder, aLayerManager,
|
RegularFramePaintCallback callback(aBuilder, aInnerList, aFrame,
|
||||||
offset);
|
offset);
|
||||||
nsRect dirtyRect = aDirtyRect - offset;
|
nsRect dirtyRect = aDirtyRect - offset;
|
||||||
filterFrame->PaintFilteredFrame(aCtx, aFrame, &callback, &dirtyRect);
|
filterFrame->PaintFilteredFrame(aCtx, aFrame, &callback, &dirtyRect);
|
||||||
} else {
|
} else {
|
||||||
gfx->SetMatrix(matrixAutoSaveRestore.Matrix());
|
gfx->SetMatrix(matrixAutoSaveRestore.Matrix());
|
||||||
aLayerManager->EndTransaction(FrameLayerBuilder::DrawThebesLayer, aBuilder);
|
aInnerList->PaintForFrame(aBuilder, aCtx, aFrame,
|
||||||
|
nsDisplayList::PAINT_DEFAULT);
|
||||||
aCtx->Translate(offset);
|
aCtx->Translate(offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -10,7 +10,6 @@
|
|||||||
#include "gfxPattern.h"
|
#include "gfxPattern.h"
|
||||||
#include "gfxRect.h"
|
#include "gfxRect.h"
|
||||||
#include "nsRect.h"
|
#include "nsRect.h"
|
||||||
#include "Layers.h"
|
|
||||||
|
|
||||||
class nsDisplayList;
|
class nsDisplayList;
|
||||||
class nsDisplayListBuilder;
|
class nsDisplayListBuilder;
|
||||||
@ -135,7 +134,7 @@ public:
|
|||||||
PaintFramesWithEffects(nsRenderingContext* aCtx,
|
PaintFramesWithEffects(nsRenderingContext* aCtx,
|
||||||
nsIFrame* aFrame, const nsRect& aDirtyRect,
|
nsIFrame* aFrame, const nsRect& aDirtyRect,
|
||||||
nsDisplayListBuilder* aBuilder,
|
nsDisplayListBuilder* aBuilder,
|
||||||
mozilla::layers::LayerManager* aManager);
|
nsDisplayList* aInnerList);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* SVG frames expect to paint in SVG user units, which are equal to CSS px
|
* SVG frames expect to paint in SVG user units, which are equal to CSS px
|
||||||
|
Loading…
Reference in New Issue
Block a user