Backout changeset eea5704272d0 (bug 539356) because of performance and correctness regressions

This commit is contained in:
Ehsan Akhgari 2012-07-03 20:28:32 -04:00
parent 15926d8730
commit 7ca323fbe6
6 changed files with 20 additions and 84 deletions

View File

@ -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) {

View File

@ -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
}; };
/** /**

View File

@ -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,

View File

@ -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

View File

@ -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);
} }

View File

@ -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