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
Родитель d7b5949095
Коммит 0a629a3bf0
6 изменённых файлов: 20 добавлений и 84 удалений

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

@ -1564,8 +1564,7 @@ DumpPaintedImage(nsDisplayItem* aItem, gfxASurface* aSurf)
static void
PaintInactiveLayer(nsDisplayListBuilder* aBuilder,
nsDisplayItem* aItem,
gfxContext* aContext,
nsRenderingContext* aCtx)
gfxContext* aContext)
{
// This item has an inactive layer. Render it to a ThebesLayer
// using a temporary BasicLayerManager.
@ -1596,11 +1595,7 @@ PaintInactiveLayer(nsDisplayListBuilder* aBuilder,
tempManager->SetRoot(layer);
aBuilder->LayerBuilder()->WillEndTransaction(tempManager);
if (aItem->GetType() == nsDisplayItem::TYPE_SVG_EFFECTS) {
static_cast<nsDisplaySVGEffects*>(aItem)->PaintAsLayer(aBuilder, aCtx, tempManager);
} else {
tempManager->EndTransaction(FrameLayerBuilder::DrawThebesLayer, aBuilder);
}
tempManager->EndTransaction(FrameLayerBuilder::DrawThebesLayer, aBuilder);
aBuilder->LayerBuilder()->DidEndTransaction(tempManager);
#ifdef MOZ_DUMP_PAINTING
@ -2565,7 +2560,7 @@ FrameLayerBuilder::DrawThebesLayer(ThebesLayer* aLayer,
}
if (cdi->mInactiveLayer) {
PaintInactiveLayer(builder, cdi->mItem, aContext, rc);
PaintInactiveLayer(builder, cdi->mItem, aContext);
} else {
nsIFrame* frame = cdi->mItem->GetUnderlyingFrame();
if (frame) {

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

@ -29,9 +29,7 @@ enum LayerState {
// when the layer has rounded rect clips.
LAYER_ACTIVE_FORCE,
// Special layer that is metadata only.
LAYER_ACTIVE_EMPTY,
// Inactive style layer for rendering SVG effects.
LAYER_SVG_EFFECTS
LAYER_ACTIVE_EMPTY
};
/**

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

@ -3256,52 +3256,11 @@ nsDisplaySVGEffects::HitTest(nsDisplayListBuilder* aBuilder, const nsRect& aRect
}
}
void
nsDisplaySVGEffects::PaintAsLayer(nsDisplayListBuilder* aBuilder,
nsRenderingContext* aCtx,
LayerManager* aManager)
void nsDisplaySVGEffects::Paint(nsDisplayListBuilder* aBuilder,
nsRenderingContext* aCtx)
{
nsSVGIntegrationUtils::PaintFramesWithEffects(aCtx, mFrame,
mVisibleRect,
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();
nsSVGIntegrationUtils::PaintFramesWithEffects(aCtx,
mFrame, mVisibleRect, aBuilder, &mList);
}
bool nsDisplaySVGEffects::ComputeVisibility(nsDisplayListBuilder* aBuilder,

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

@ -2173,24 +2173,13 @@ public:
*aSnap = false;
return mEffectsBounds + ToReferenceFrame();
}
virtual void Paint(nsDisplayListBuilder* aBuilder, nsRenderingContext* aCtx);
virtual bool ComputeVisibility(nsDisplayListBuilder* aBuilder,
nsRegion* aVisibleRegion,
const nsRect& aAllowVisibleRegionExpansion);
virtual bool TryMerge(nsDisplayListBuilder* aBuilder, nsDisplayItem* aItem);
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
void PrintEffects(FILE* aOutput);
#endif

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

@ -18,11 +18,6 @@
#include "nsSVGMaskFrame.h"
#include "nsSVGPaintServerFrame.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:
RegularFramePaintCallback(nsDisplayListBuilder* aBuilder,
LayerManager* aManager,
nsDisplayList* aInnerList,
nsIFrame* aFrame,
const nsPoint& aOffset)
: mBuilder(aBuilder), mLayerManager(aManager),
: mBuilder(aBuilder), mInnerList(aInnerList), mFrame(aFrame),
mOffset(aOffset) {}
virtual void Paint(nsRenderingContext *aContext, nsIFrame *aTarget,
const nsIntRect* aDirtyRect)
{
BasicLayerManager* basic = static_cast<BasicLayerManager*>(mLayerManager);
basic->SetTarget(aContext->ThebesContext());
nsRenderingContext::AutoPushTranslation push(aContext, -mOffset);
mLayerManager->EndTransaction(FrameLayerBuilder::DrawThebesLayer, mBuilder);
mInnerList->PaintForFrame(mBuilder, aContext, mFrame, nsDisplayList::PAINT_DEFAULT);
}
private:
nsDisplayListBuilder* mBuilder;
LayerManager* mLayerManager;
nsDisplayList* mInnerList;
nsIFrame* mFrame;
nsPoint mOffset;
};
@ -371,7 +366,7 @@ nsSVGIntegrationUtils::PaintFramesWithEffects(nsRenderingContext* aCtx,
nsIFrame* aFrame,
const nsRect& aDirtyRect,
nsDisplayListBuilder* aBuilder,
LayerManager *aLayerManager)
nsDisplayList* aInnerList)
{
#ifdef DEBUG
nsISVGChildFrame *svgChildFrame = do_QueryFrame(aFrame);
@ -447,13 +442,14 @@ nsSVGIntegrationUtils::PaintFramesWithEffects(nsRenderingContext* aCtx,
/* Paint the child */
if (filterFrame) {
RegularFramePaintCallback callback(aBuilder, aLayerManager,
RegularFramePaintCallback callback(aBuilder, aInnerList, aFrame,
offset);
nsRect dirtyRect = aDirtyRect - offset;
filterFrame->PaintFilteredFrame(aCtx, aFrame, &callback, &dirtyRect);
} else {
gfx->SetMatrix(matrixAutoSaveRestore.Matrix());
aLayerManager->EndTransaction(FrameLayerBuilder::DrawThebesLayer, aBuilder);
aInnerList->PaintForFrame(aBuilder, aCtx, aFrame,
nsDisplayList::PAINT_DEFAULT);
aCtx->Translate(offset);
}

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

@ -10,7 +10,6 @@
#include "gfxPattern.h"
#include "gfxRect.h"
#include "nsRect.h"
#include "Layers.h"
class nsDisplayList;
class nsDisplayListBuilder;
@ -135,7 +134,7 @@ public:
PaintFramesWithEffects(nsRenderingContext* aCtx,
nsIFrame* aFrame, const nsRect& aDirtyRect,
nsDisplayListBuilder* aBuilder,
mozilla::layers::LayerManager* aManager);
nsDisplayList* aInnerList);
/**
* SVG frames expect to paint in SVG user units, which are equal to CSS px