author | Markus Stange <mstange@themasta.com> |
Mon, 15 Sep 2014 12:12:52 +0200 | |
changeset 205300 | 89bc7483714f35d74395df0b4c744fa367ddeae4 |
parent 205299 | b7bed5a0ee602b6839db7e2fb07533a69064d79a |
child 205301 | 3bda71abf6481ebcbec0c95fccad4dc59d82d443 |
push id | 49133 |
push user | mstange@themasta.com |
push date | Mon, 15 Sep 2014 10:25:52 +0000 |
treeherder | mozilla-inbound@f5ab7e76389e [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | roc |
bugs | 1066270 |
milestone | 35.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
layout/svg/nsFilterInstance.cpp | file | annotate | diff | comparison | revisions | |
layout/svg/nsFilterInstance.h | file | annotate | diff | comparison | revisions |
--- a/layout/svg/nsFilterInstance.cpp +++ b/layout/svg/nsFilterInstance.cpp @@ -22,16 +22,33 @@ #include "SVGContentUtils.h" #include "FilterSupport.h" #include "gfx2DGlue.h" using namespace mozilla; using namespace mozilla::dom; using namespace mozilla::gfx; +FilterDescription +nsFilterInstance::GetFilterDescription(nsIContent* aFilteredElement, + const nsTArray<nsStyleFilter>& aFilterChain, + const UserSpaceMetrics& aMetrics, + const gfxRect& aBBox, + nsTArray<mozilla::RefPtr<SourceSurface>>& aOutAdditionalImages) +{ + gfxMatrix unused; // aPaintTransform arg not used since we're not painting + nsFilterInstance instance(nullptr, aFilteredElement, aMetrics, + aFilterChain, nullptr, unused, + nullptr, nullptr, nullptr, &aBBox); + if (!instance.IsInitialized()) { + return FilterDescription(); + } + return instance.ExtractDescriptionAndAdditionalImages(aOutAdditionalImages); +} + static UniquePtr<UserSpaceMetrics> UserSpaceMetricsForFrame(nsIFrame* aFrame) { if (aFrame->GetContent()->IsSVG()) { nsSVGElement* element = static_cast<nsSVGElement*>(aFrame->GetContent()); return MakeUnique<SVGElementMetrics>(element); } return MakeUnique<NonSVGFrameUserSpaceMetrics>(aFrame);
--- a/layout/svg/nsFilterInstance.h +++ b/layout/svg/nsFilterInstance.h @@ -53,16 +53,29 @@ class nsFilterInstance typedef mozilla::gfx::SourceSurface SourceSurface; typedef mozilla::gfx::DrawTarget DrawTarget; typedef mozilla::gfx::FilterPrimitiveDescription FilterPrimitiveDescription; typedef mozilla::gfx::FilterDescription FilterDescription; typedef mozilla::dom::UserSpaceMetrics UserSpaceMetrics; public: /** + * Create a FilterDescription for the supplied filter. All coordinates in + * the description are in filter space. + * @param aOutAdditionalImages Will contain additional images needed to + * render the filter (from feImage primitives). + * @return A FilterDescription describing the filter. + */ + static FilterDescription GetFilterDescription(nsIContent* aFilteredElement, + const nsTArray<nsStyleFilter>& aFilterChain, + const UserSpaceMetrics& aMetrics, + const gfxRect& aBBox, + nsTArray<mozilla::RefPtr<SourceSurface>>& aOutAdditionalImages); + + /** * Paint the given filtered frame. * @param aDirtyArea The area than needs to be painted, in aFilteredFrame's * frame space (i.e. relative to its origin, the top-left corner of its * border box). */ static nsresult PaintFilteredFrame(nsIFrame *aFilteredFrame, nsRenderingContext *aContext, const gfxMatrix& aTransform, @@ -139,16 +152,22 @@ public: /** * Draws the filter output into aContext. The area that * needs to be painted must have been specified before calling this method * by passing it as the aPostFilterDirtyRegion argument to the * nsFilterInstance constructor. */ nsresult Render(gfxContext* aContext); + const FilterDescription& ExtractDescriptionAndAdditionalImages(nsTArray<mozilla::RefPtr<SourceSurface>>& aOutAdditionalImages) + { + mInputImages.SwapElements(aOutAdditionalImages); + return mFilterDescription; + } + /** * Sets the aPostFilterDirtyRegion outparam to the post-filter area in frame * space that would be dirtied by mTargetFrame when a given * pre-filter area of mTargetFrame is dirtied. The pre-filter area must have * been specified before calling this method by passing it as the * aPreFilterDirtyRegion argument to the nsFilterInstance constructor. */ nsRegion ComputePostFilterDirtyRegion();