Bug 1438631. Use a similar drawtarget when painting masks. r=mstange
Avoiding an offscreen drawtarget will avoid using Direct2D with webrender,
let us record the masking operation, and also give us OMTP.
--- a/gfx/2d/RecordedEvent.h
+++ b/gfx/2d/RecordedEvent.h
@@ -254,16 +254,17 @@ public:
CREATESIMILARDRAWTARGET,
CREATECLIPPEDDRAWTARGET,
FONTDATA,
FONTDESC,
PUSHLAYER,
POPLAYER,
UNSCALEDFONTCREATION,
UNSCALEDFONTDESTRUCTION,
+ INTOLUMINANCE,
};
static const uint32_t kTotalEventTypes = RecordedEvent::FILTERNODESETINPUT + 1;
virtual ~RecordedEvent() {}
static std::string GetEventName(EventType aType);
/**
--- a/gfx/2d/RecordedEventImpl.h
+++ b/gfx/2d/RecordedEventImpl.h
@@ -900,17 +900,17 @@ private:
template<class S>
MOZ_IMPLICIT RecordedSnapshot(S &aStream);
};
class RecordedIntoLuminanceSource : public RecordedEventDerived<RecordedIntoLuminanceSource> {
public:
RecordedIntoLuminanceSource(ReferencePtr aRefPtr, DrawTarget *aDT,
LuminanceType aLuminanceType, float aOpacity)
- : RecordedEventDerived(SNAPSHOT), mRefPtr(aRefPtr), mDT(aDT),
+ : RecordedEventDerived(INTOLUMINANCE), mRefPtr(aRefPtr), mDT(aDT),
mLuminanceType(aLuminanceType), mOpacity(aOpacity)
{
}
virtual bool PlayEvent(Translator *aTranslator) const override;
template<class S> void Record(S &aStream) const;
virtual void OutputSimpleEventInfo(std::stringstream &aStringStream) const override;
@@ -2795,17 +2795,17 @@ RecordedIntoLuminanceSource::Record(S &a
WriteElement(aStream, mRefPtr);
WriteElement(aStream, mDT);
WriteElement(aStream, mLuminanceType);
WriteElement(aStream, mOpacity);
}
template<class S>
RecordedIntoLuminanceSource::RecordedIntoLuminanceSource(S &aStream)
- : RecordedEventDerived(SNAPSHOT)
+ : RecordedEventDerived(INTOLUMINANCE)
{
ReadElement(aStream, mRefPtr);
ReadElement(aStream, mDT);
ReadElement(aStream, mLuminanceType);
ReadElement(aStream, mOpacity);
}
inline void
@@ -3408,17 +3408,18 @@ RecordedFilterNodeSetInput::OutputSimple
f(FILTERNODESETINPUT, RecordedFilterNodeSetInput); \
f(CREATESIMILARDRAWTARGET, RecordedCreateSimilarDrawTarget); \
f(CREATECLIPPEDDRAWTARGET, RecordedCreateClippedDrawTarget); \
f(FONTDATA, RecordedFontData); \
f(FONTDESC, RecordedFontDescriptor); \
f(PUSHLAYER, RecordedPushLayer); \
f(POPLAYER, RecordedPopLayer); \
f(UNSCALEDFONTCREATION, RecordedUnscaledFontCreation); \
- f(UNSCALEDFONTDESTRUCTION, RecordedUnscaledFontDestruction);
+ f(UNSCALEDFONTDESTRUCTION, RecordedUnscaledFontDestruction); \
+ f(INTOLUMINANCE, RecordedIntoLuminanceSource);
template<class S>
RecordedEvent *
RecordedEvent::LoadEvent(S &aStream, EventType aType)
{
switch (aType) {
FOR_EACH_EVENT(LOAD_EVENT_TYPE)
default:
--- a/layout/svg/nsSVGMaskFrame.cpp
+++ b/layout/svg/nsSVGMaskFrame.cpp
@@ -83,20 +83,20 @@ nsSVGMaskFrame::GetMaskForMaskedFrame(Ma
maskType = StyleSVGReset()->mMaskType;
} else {
maskType = aParams.maskMode == NS_STYLE_MASK_MODE_LUMINANCE
? NS_STYLE_MASK_TYPE_LUMINANCE : NS_STYLE_MASK_TYPE_ALPHA;
}
RefPtr<DrawTarget> maskDT;
if (maskType == NS_STYLE_MASK_TYPE_LUMINANCE) {
- maskDT = gfxPlatform::GetPlatform()->CreateOffscreenContentDrawTarget(
+ maskDT = context->GetDrawTarget()->CreateSimilarDrawTarget(
maskSurfaceSize, SurfaceFormat::B8G8R8A8);
} else {
- maskDT = gfxPlatform::GetPlatform()->CreateOffscreenContentDrawTarget(
+ maskDT = context->GetDrawTarget()->CreateSimilarDrawTarget(
maskSurfaceSize, SurfaceFormat::A8);
}
if (!maskDT || !maskDT->IsValid()) {
return nullptr;
}
Matrix maskSurfaceMatrix =