gecko-dev/layout/svg/nsSVGMaskFrame.h
Jeff Muizelaar 0b68652b49 Bug 1539702. Improve CreateClippedDrawTarget API r=jwatt,rhunt
This changes CreateClippedDrawTarget so that instead of taking
a max size and a transform it just takes a user space rect of
the desired bounds.

This change allows the caller to not worry about the computing
a max size based on the current clip. Instead this responsibility
is lowered into the specific backends.

The main motivation for this work is to allow blob recoordination
to create recordings that don't depend on the current clip.

Some additional benefits are that the API is easier to use and
as can be seen simplifies the SVG masking code because it doesn't
need to track surface offsets manually.

It's also an important step towards removing all the uses of
gfxContext::GetClipExtents which will let us get rid of the separate
clipping stack in gfxContext and help us move off of gfxContext
completely.

Most backend implementations of CreateClippedDrawTarget are relatively
simple. DrawTargetCapture is modified to track the current clip rect
so that it can create a new DrawTargetCapture of the appropriate size
without needing to worry about lazy resolution.

Differential Revision: https://phabricator.services.mozilla.com/D33363

--HG--
extra : moz-landing-system : lando
2019-06-21 09:51:00 +00:00

107 lines
3.2 KiB
C++

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef __NS_SVGMASKFRAME_H__
#define __NS_SVGMASKFRAME_H__
#include "mozilla/Attributes.h"
#include "mozilla/gfx/2D.h"
#include "mozilla/RefPtr.h"
#include "gfxPattern.h"
#include "gfxMatrix.h"
#include "nsSVGContainerFrame.h"
#include "nsSVGUtils.h"
class gfxContext;
namespace mozilla {
class PresShell;
} // namespace mozilla
class nsSVGMaskFrame final : public nsSVGContainerFrame {
friend nsIFrame* NS_NewSVGMaskFrame(mozilla::PresShell* aPresShell,
ComputedStyle* aStyle);
typedef mozilla::gfx::Matrix Matrix;
typedef mozilla::gfx::SourceSurface SourceSurface;
typedef mozilla::image::imgDrawingParams imgDrawingParams;
protected:
explicit nsSVGMaskFrame(ComputedStyle* aStyle, nsPresContext* aPresContext)
: nsSVGContainerFrame(aStyle, aPresContext, kClassID), mInUse(false) {
AddStateBits(NS_FRAME_IS_NONDISPLAY);
}
public:
NS_DECL_FRAMEARENA_HELPERS(nsSVGMaskFrame)
struct MaskParams {
gfxContext* ctx;
nsIFrame* maskedFrame;
const gfxMatrix& toUserSpace;
float opacity;
mozilla::StyleMaskMode maskMode;
imgDrawingParams& imgParams;
explicit MaskParams(gfxContext* aCtx, nsIFrame* aMaskedFrame,
const gfxMatrix& aToUserSpace, float aOpacity,
mozilla::StyleMaskMode aMaskMode,
imgDrawingParams& aImgParams)
: ctx(aCtx),
maskedFrame(aMaskedFrame),
toUserSpace(aToUserSpace),
opacity(aOpacity),
maskMode(aMaskMode),
imgParams(aImgParams) {}
};
// nsSVGMaskFrame method:
/**
* Generate a mask surface for the target frame.
*
* The return surface can be null, it's the caller's responsibility to
* null-check before dereferencing.
*/
already_AddRefed<SourceSurface> GetMaskForMaskedFrame(MaskParams& aParams);
gfxRect GetMaskArea(nsIFrame* aMaskedFrame);
virtual nsresult AttributeChanged(int32_t aNameSpaceID, nsAtom* aAttribute,
int32_t aModType) override;
#ifdef DEBUG
virtual void Init(nsIContent* aContent, nsContainerFrame* aParent,
nsIFrame* aPrevInFlow) override;
#endif
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
const nsDisplayListSet& aLists) override {}
#ifdef DEBUG_FRAME_DUMP
virtual nsresult GetFrameName(nsAString& aResult) const override {
return MakeFrameName(NS_LITERAL_STRING("SVGMask"), aResult);
}
#endif
private:
/**
* If the mask element transforms its children due to
* maskContentUnits="objectBoundingBox" being set on it, this function
* returns the resulting transform.
*/
gfxMatrix GetMaskTransform(nsIFrame* aMaskedFrame);
gfxMatrix mMatrixForChildren;
// recursion prevention flag
bool mInUse;
// nsSVGContainerFrame methods:
virtual gfxMatrix GetCanvasTM() override;
};
#endif