2005-04-05 01:42:26 +04:00
|
|
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
2012-05-21 15:12:37 +04:00
|
|
|
/* 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/. */
|
2005-04-05 01:42:26 +04:00
|
|
|
|
|
|
|
#ifndef NS_SVGUTILS_H
|
|
|
|
#define NS_SVGUTILS_H
|
|
|
|
|
2012-09-22 23:26:05 +04:00
|
|
|
// include math.h to pick up definition of M_ maths defines e.g. M_PI
|
2006-01-26 19:39:39 +03:00
|
|
|
#define _USE_MATH_DEFINES
|
|
|
|
#include <math.h>
|
|
|
|
|
2013-10-02 01:02:16 +04:00
|
|
|
#include "DrawMode.h"
|
2013-11-01 15:04:01 +04:00
|
|
|
#include "gfx2DGlue.h"
|
2012-03-20 16:15:55 +04:00
|
|
|
#include "gfxMatrix.h"
|
|
|
|
#include "gfxPoint.h"
|
|
|
|
#include "gfxRect.h"
|
2013-11-01 15:04:01 +04:00
|
|
|
#include "mozilla/gfx/Rect.h"
|
2012-03-20 16:15:55 +04:00
|
|
|
#include "nsAlgorithm.h"
|
2012-05-17 08:05:09 +04:00
|
|
|
#include "nsChangeHint.h"
|
2012-03-20 16:15:55 +04:00
|
|
|
#include "nsColor.h"
|
2006-02-26 20:58:58 +03:00
|
|
|
#include "nsCOMPtr.h"
|
2012-03-20 16:15:55 +04:00
|
|
|
#include "nsID.h"
|
|
|
|
#include "nsISupportsBase.h"
|
|
|
|
#include "nsMathUtils.h"
|
2012-09-06 08:58:46 +04:00
|
|
|
#include "nsStyleStruct.h"
|
2012-08-07 00:32:11 +04:00
|
|
|
#include "mozilla/Constants.h"
|
2013-01-15 16:22:03 +04:00
|
|
|
#include <algorithm>
|
2005-09-15 03:30:37 +04:00
|
|
|
|
2012-03-20 16:15:55 +04:00
|
|
|
class gfxContext;
|
|
|
|
class gfxPattern;
|
|
|
|
class nsFrameList;
|
|
|
|
class nsIContent;
|
2006-07-27 15:58:05 +04:00
|
|
|
class nsIDocument;
|
2012-03-20 16:15:55 +04:00
|
|
|
class nsIFrame;
|
2005-04-05 01:42:26 +04:00
|
|
|
class nsPresContext;
|
2012-03-20 16:15:55 +04:00
|
|
|
class nsRenderingContext;
|
2009-08-21 01:52:47 +04:00
|
|
|
class nsStyleContext;
|
2005-04-05 01:42:26 +04:00
|
|
|
class nsStyleCoord;
|
2014-05-13 05:24:35 +04:00
|
|
|
class nsSVGClipPathFrame;
|
2012-03-20 16:15:55 +04:00
|
|
|
class nsSVGDisplayContainerFrame;
|
2006-04-14 19:09:39 +04:00
|
|
|
class nsSVGElement;
|
2007-12-04 07:40:52 +03:00
|
|
|
class nsSVGEnum;
|
2012-03-20 16:15:55 +04:00
|
|
|
class nsSVGLength2;
|
|
|
|
class nsSVGOuterSVGFrame;
|
2011-09-05 21:53:34 +04:00
|
|
|
class nsSVGPathGeometryFrame;
|
2012-08-10 15:13:44 +04:00
|
|
|
class nsTextFrame;
|
2013-05-16 06:35:12 +04:00
|
|
|
class gfxTextContextPaint;
|
2012-03-20 16:15:55 +04:00
|
|
|
|
|
|
|
struct nsStyleSVG;
|
|
|
|
struct nsStyleSVGPaint;
|
2013-09-07 06:15:49 +04:00
|
|
|
struct nsRect;
|
|
|
|
struct nsIntRect;
|
|
|
|
struct nsPoint;
|
2005-04-05 01:42:26 +04:00
|
|
|
|
2010-04-30 17:12:06 +04:00
|
|
|
namespace mozilla {
|
2010-12-20 03:45:29 +03:00
|
|
|
class SVGAnimatedPreserveAspectRatio;
|
2010-12-20 03:45:29 +03:00
|
|
|
class SVGPreserveAspectRatio;
|
2010-04-30 17:12:06 +04:00
|
|
|
namespace dom {
|
|
|
|
class Element;
|
2014-09-15 14:12:50 +04:00
|
|
|
class UserSpaceMetrics;
|
2010-04-30 17:12:06 +04:00
|
|
|
} // namespace dom
|
2013-11-27 15:25:29 +04:00
|
|
|
namespace gfx {
|
|
|
|
class SourceSurface;
|
|
|
|
}
|
2010-04-30 17:12:06 +04:00
|
|
|
} // namespace mozilla
|
|
|
|
|
2007-06-13 13:02:48 +04:00
|
|
|
// maximum dimension of an offscreen surface - choose so that
|
|
|
|
// the surface size doesn't overflow a 32-bit signed int using
|
|
|
|
// 4 bytes per pixel; in line with gfxASurface::CheckSurfaceSize
|
2009-12-28 12:49:08 +03:00
|
|
|
// In fact Macs can't even manage that
|
|
|
|
#define NS_SVG_OFFSCREEN_MAX_DIMENSION 4096
|
2007-06-13 13:02:48 +04:00
|
|
|
|
2012-08-10 15:13:43 +04:00
|
|
|
#define SVG_HIT_TEST_FILL 0x01
|
|
|
|
#define SVG_HIT_TEST_STROKE 0x02
|
|
|
|
#define SVG_HIT_TEST_CHECK_MRECT 0x04
|
|
|
|
|
2009-03-10 04:20:17 +03:00
|
|
|
|
2012-05-17 08:05:04 +04:00
|
|
|
bool NS_SVGDisplayListHitTestingEnabled();
|
|
|
|
bool NS_SVGDisplayListPaintingEnabled();
|
2014-05-13 05:24:35 +04:00
|
|
|
bool NS_SVGNewGetBBoxEnabled();
|
2012-05-17 08:05:04 +04:00
|
|
|
|
2012-04-16 12:23:48 +04:00
|
|
|
/**
|
|
|
|
* Sometimes we need to distinguish between an empty box and a box
|
|
|
|
* that contains an element that has no size e.g. a point at the origin.
|
|
|
|
*/
|
|
|
|
class SVGBBox {
|
2013-11-01 15:04:01 +04:00
|
|
|
typedef mozilla::gfx::Rect Rect;
|
|
|
|
|
2012-04-16 12:23:48 +04:00
|
|
|
public:
|
|
|
|
SVGBBox()
|
|
|
|
: mIsEmpty(true) {}
|
|
|
|
|
2014-08-20 08:58:22 +04:00
|
|
|
MOZ_IMPLICIT SVGBBox(const Rect& aRect)
|
2012-04-16 12:23:48 +04:00
|
|
|
: mBBox(aRect), mIsEmpty(false) {}
|
|
|
|
|
2014-08-20 08:58:22 +04:00
|
|
|
MOZ_IMPLICIT SVGBBox(const gfxRect& aRect)
|
2013-11-01 15:04:01 +04:00
|
|
|
: mBBox(ToRect(aRect)), mIsEmpty(false) {}
|
2012-04-16 12:23:48 +04:00
|
|
|
|
2013-11-01 15:04:01 +04:00
|
|
|
gfxRect ToThebesRect() const {
|
|
|
|
return ThebesRect(mBBox);
|
2012-04-16 12:23:48 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
bool IsEmpty() const {
|
|
|
|
return mIsEmpty;
|
|
|
|
}
|
|
|
|
|
2014-07-05 22:19:13 +04:00
|
|
|
bool IsFinite() const {
|
|
|
|
return mBBox.IsFinite();
|
|
|
|
}
|
|
|
|
|
|
|
|
void Scale(float aScale) {
|
|
|
|
mBBox.Scale(aScale);
|
|
|
|
}
|
|
|
|
|
2012-04-16 12:23:48 +04:00
|
|
|
void UnionEdges(const SVGBBox& aSVGBBox) {
|
|
|
|
if (aSVGBBox.mIsEmpty) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
mBBox = mIsEmpty ? aSVGBBox.mBBox : mBBox.UnionEdges(aSVGBBox.mBBox);
|
|
|
|
mIsEmpty = false;
|
|
|
|
}
|
|
|
|
|
2014-05-13 05:24:35 +04:00
|
|
|
void Intersect(const SVGBBox& aSVGBBox) {
|
|
|
|
if (!mIsEmpty && !aSVGBBox.mIsEmpty) {
|
|
|
|
mBBox = mBBox.Intersect(aSVGBBox.mBBox);
|
|
|
|
if (mBBox.IsEmpty()) {
|
|
|
|
mIsEmpty = true;
|
|
|
|
mBBox = Rect(0, 0, 0, 0);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
mIsEmpty = true;
|
|
|
|
mBBox = Rect(0, 0, 0, 0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-04-16 12:23:48 +04:00
|
|
|
private:
|
2013-11-01 15:04:01 +04:00
|
|
|
Rect mBBox;
|
|
|
|
bool mIsEmpty;
|
2012-04-16 12:23:48 +04:00
|
|
|
};
|
2012-03-02 12:28:59 +04:00
|
|
|
|
2008-08-06 05:58:29 +04:00
|
|
|
// GRRR WINDOWS HATE HATE HATE
|
|
|
|
#undef CLIP_MASK
|
|
|
|
|
2013-04-12 07:20:45 +04:00
|
|
|
class MOZ_STACK_CLASS SVGAutoRenderState
|
2006-11-27 20:30:57 +03:00
|
|
|
{
|
|
|
|
public:
|
2012-06-15 13:06:34 +04:00
|
|
|
enum RenderMode {
|
|
|
|
/**
|
|
|
|
* Used to inform SVG frames that they should paint as normal.
|
|
|
|
*/
|
|
|
|
NORMAL,
|
|
|
|
/**
|
|
|
|
* Used to inform SVG frames when they are painting as the child of a
|
|
|
|
* simple clipPath. In this case they should only draw their basic geometry
|
|
|
|
* as a path. They should not fill, stroke, or paint anything else.
|
|
|
|
*/
|
|
|
|
CLIP,
|
|
|
|
/**
|
|
|
|
* Used to inform SVG frames when they are painting as the child of a
|
|
|
|
* complex clipPath that requires the use of a clip mask. In this case they
|
|
|
|
* should only draw their basic geometry as a path and then fill it using
|
|
|
|
* fully opaque white. They should not stroke, or paint anything else.
|
|
|
|
*/
|
|
|
|
CLIP_MASK
|
|
|
|
};
|
2006-11-27 20:30:57 +03:00
|
|
|
|
2013-12-26 22:49:49 +04:00
|
|
|
SVGAutoRenderState(nsRenderingContext *aContext, RenderMode aMode
|
|
|
|
MOZ_GUARD_OBJECT_NOTIFIER_PARAM);
|
2012-03-02 12:28:59 +04:00
|
|
|
~SVGAutoRenderState();
|
2006-11-27 20:30:57 +03:00
|
|
|
|
2012-03-02 12:28:59 +04:00
|
|
|
void SetPaintingToWindow(bool aPaintingToWindow);
|
2006-11-27 20:30:57 +03:00
|
|
|
|
2012-03-02 12:28:59 +04:00
|
|
|
static RenderMode GetRenderMode(nsRenderingContext *aContext);
|
|
|
|
static bool IsPaintingToWindow(nsRenderingContext *aContext);
|
2010-10-15 05:03:45 +04:00
|
|
|
|
2006-11-27 20:30:57 +03:00
|
|
|
private:
|
2012-03-02 12:28:59 +04:00
|
|
|
nsRenderingContext *mContext;
|
|
|
|
void *mOriginalRenderState;
|
|
|
|
RenderMode mMode;
|
|
|
|
bool mPaintingToWindow;
|
2013-12-26 22:49:49 +04:00
|
|
|
MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER
|
2006-11-27 20:30:57 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
|
2014-02-10 08:31:03 +04:00
|
|
|
#define NS_ISVGFILTERREFERENCE_IID \
|
2008-01-02 23:49:13 +03:00
|
|
|
{ 0x9744ee20, 0x1bcf, 0x4c62, \
|
|
|
|
{ 0x86, 0x7d, 0xd3, 0x7a, 0x91, 0x60, 0x3e, 0xef } }
|
|
|
|
|
2014-02-10 08:31:03 +04:00
|
|
|
class nsISVGFilterReference : public nsISupports
|
2008-01-02 23:49:13 +03:00
|
|
|
{
|
|
|
|
public:
|
2014-02-10 08:31:03 +04:00
|
|
|
NS_DECLARE_STATIC_IID_ACCESSOR(NS_ISVGFILTERREFERENCE_IID)
|
2008-01-02 23:49:13 +03:00
|
|
|
virtual void Invalidate() = 0;
|
|
|
|
};
|
|
|
|
|
2014-02-10 08:31:03 +04:00
|
|
|
NS_DEFINE_STATIC_IID_ACCESSOR(nsISVGFilterReference, NS_ISVGFILTERREFERENCE_IID)
|
2008-01-02 23:49:13 +03:00
|
|
|
|
2012-09-22 23:26:05 +04:00
|
|
|
/**
|
|
|
|
* General functions used by all of SVG layout and possibly content code.
|
|
|
|
* If a method is used by content and depends only on other content methods
|
|
|
|
* it should go in SVGContentUtils instead.
|
|
|
|
*/
|
2005-04-05 01:42:26 +04:00
|
|
|
class nsSVGUtils
|
|
|
|
{
|
|
|
|
public:
|
2012-12-12 03:15:07 +04:00
|
|
|
typedef mozilla::dom::Element Element;
|
2010-12-20 03:45:29 +03:00
|
|
|
|
2012-05-17 08:05:04 +04:00
|
|
|
static void Init();
|
|
|
|
|
2009-04-25 03:17:43 +04:00
|
|
|
/**
|
|
|
|
* Gets the nearest nsSVGInnerSVGFrame or nsSVGOuterSVGFrame frame. aFrame
|
|
|
|
* must be an SVG frame. If aFrame is of type nsGkAtoms::svgOuterSVGFrame,
|
2012-07-30 18:20:58 +04:00
|
|
|
* returns nullptr.
|
2009-04-25 03:17:43 +04:00
|
|
|
*/
|
|
|
|
static nsSVGDisplayContainerFrame* GetNearestSVGViewport(nsIFrame *aFrame);
|
2012-05-17 08:05:09 +04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the frame's post-filter visual overflow rect when passed the
|
|
|
|
* frame's pre-filter visual overflow rect. If the frame is not currently
|
|
|
|
* being filtered, this function simply returns aUnfilteredRect.
|
|
|
|
*/
|
|
|
|
static nsRect GetPostFilterVisualOverflowRect(nsIFrame *aFrame,
|
|
|
|
const nsRect &aUnfilteredRect);
|
|
|
|
|
2012-03-20 16:15:53 +04:00
|
|
|
/**
|
|
|
|
* Schedules an update of the frame's bounds (which will in turn invalidate
|
|
|
|
* the new area that the frame should paint to).
|
|
|
|
*
|
2013-07-12 11:13:07 +04:00
|
|
|
* This does nothing when passed an NS_FRAME_IS_NONDISPLAY frame.
|
2012-07-22 04:01:44 +04:00
|
|
|
* In future we may want to allow ReflowSVG to be called on such frames,
|
|
|
|
* but that would be better implemented as a ForceReflowSVG function to
|
2012-03-20 16:15:53 +04:00
|
|
|
* be called synchronously while painting them without marking or paying
|
|
|
|
* attention to dirty bits like this function.
|
|
|
|
*
|
|
|
|
* This is very similar to PresShell::FrameNeedsReflow. The main reason that
|
|
|
|
* we have this function instead of using FrameNeedsReflow is because we need
|
|
|
|
* to be able to call it under nsSVGOuterSVGFrame::NotifyViewportChange when
|
|
|
|
* that function is called by nsSVGOuterSVGFrame::Reflow. FrameNeedsReflow
|
|
|
|
* is not suitable for calling during reflow though, and it asserts as much.
|
|
|
|
* The reason that we want to be callable under NotifyViewportChange is
|
|
|
|
* because we want to synchronously notify and dirty the nsSVGOuterSVGFrame's
|
|
|
|
* children so that when nsSVGOuterSVGFrame::DidReflow is called its children
|
|
|
|
* will be updated for the new size as appropriate. Otherwise we'd have to
|
|
|
|
* post an event to the event loop to mark dirty flags and request an update.
|
|
|
|
*
|
|
|
|
* Another reason that we don't currently want to call
|
|
|
|
* PresShell::FrameNeedsReflow is because passing eRestyle to it to get it to
|
|
|
|
* mark descendants dirty would cause it to descend through
|
|
|
|
* nsSVGForeignObjectFrame frames to mark their children dirty, but we want to
|
|
|
|
* handle nsSVGForeignObjectFrame specially. It would also do unnecessary work
|
2013-07-12 11:13:07 +04:00
|
|
|
* descending into NS_FRAME_IS_NONDISPLAY frames.
|
2008-04-08 16:51:19 +04:00
|
|
|
*/
|
2012-07-22 04:01:44 +04:00
|
|
|
static void ScheduleReflowSVG(nsIFrame *aFrame);
|
2012-03-20 16:15:53 +04:00
|
|
|
|
|
|
|
/**
|
2012-07-22 04:01:44 +04:00
|
|
|
* Returns true if the frame or any of its children need ReflowSVG
|
2012-03-20 16:15:53 +04:00
|
|
|
* to be called on them.
|
|
|
|
*/
|
2012-07-22 04:01:44 +04:00
|
|
|
static bool NeedsReflowSVG(nsIFrame *aFrame);
|
2008-04-08 16:51:19 +04:00
|
|
|
|
2008-03-20 00:27:33 +03:00
|
|
|
/*
|
|
|
|
* Update the filter invalidation region for ancestor frames, if relevant.
|
|
|
|
*/
|
|
|
|
static void NotifyAncestorsOfFilterRegionChange(nsIFrame *aFrame);
|
|
|
|
|
2005-09-07 02:30:40 +04:00
|
|
|
/* Computes the input length in terms of object space coordinates.
|
|
|
|
Input: rect - bounding box
|
|
|
|
length - length to be converted
|
|
|
|
*/
|
2009-06-11 19:21:03 +04:00
|
|
|
static float ObjectSpace(const gfxRect &aRect, const nsSVGLength2 *aLength);
|
2005-09-07 02:30:40 +04:00
|
|
|
|
|
|
|
/* Computes the input length in terms of user space coordinates.
|
|
|
|
Input: content - object to be used for determining user space
|
2008-09-11 04:24:16 +04:00
|
|
|
Input: length - length to be converted
|
|
|
|
*/
|
|
|
|
static float UserSpace(nsSVGElement *aSVGElement, const nsSVGLength2 *aLength);
|
|
|
|
static float UserSpace(nsIFrame *aFrame, const nsSVGLength2 *aLength);
|
2014-09-15 14:12:50 +04:00
|
|
|
static float UserSpace(const mozilla::dom::UserSpaceMetrics& aMetrics, const nsSVGLength2 *aLength);
|
2005-09-07 02:30:40 +04:00
|
|
|
|
2006-02-14 00:22:41 +03:00
|
|
|
/* Find the outermost SVG frame of the passed frame */
|
2006-06-15 23:10:28 +04:00
|
|
|
static nsSVGOuterSVGFrame *
|
2006-02-14 00:22:41 +03:00
|
|
|
GetOuterSVGFrame(nsIFrame *aFrame);
|
|
|
|
|
2007-05-31 02:32:54 +04:00
|
|
|
/**
|
|
|
|
* Get the covered region for a frame. Return null if it's not an SVG frame.
|
2008-08-25 13:23:54 +04:00
|
|
|
* @param aRect gets a rectangle in app units
|
2007-05-31 02:32:54 +04:00
|
|
|
* @return the outer SVG frame which aRect is relative to
|
|
|
|
*/
|
|
|
|
static nsIFrame*
|
|
|
|
GetOuterSVGFrameAndCoveredRegion(nsIFrame* aFrame, nsRect* aRect);
|
|
|
|
|
2008-09-11 04:24:16 +04:00
|
|
|
/* Paint SVG frame with SVG effects - aDirtyRect is the area being
|
|
|
|
* redrawn, in device pixel coordinates relative to the outer svg */
|
2006-03-21 18:49:20 +03:00
|
|
|
static void
|
2014-08-29 23:42:07 +04:00
|
|
|
PaintFrameWithEffects(nsIFrame *aFrame,
|
|
|
|
nsRenderingContext *aContext,
|
|
|
|
const gfxMatrix& aTransform,
|
|
|
|
const nsIntRect *aDirtyRect = nullptr);
|
2006-03-21 18:49:20 +03:00
|
|
|
|
|
|
|
/* Hit testing - check if point hits the clipPath of indicated
|
2008-08-25 13:23:54 +04:00
|
|
|
* frame. Returns true if no clipPath set. */
|
2011-09-29 10:19:26 +04:00
|
|
|
static bool
|
2014-08-07 11:09:31 +04:00
|
|
|
HitTestClip(nsIFrame *aFrame, const gfxPoint &aPoint);
|
2008-08-19 20:20:16 +04:00
|
|
|
|
2014-08-07 11:09:31 +04:00
|
|
|
/**
|
|
|
|
* Hit testing - check if point hits any children of aFrame. aPoint is
|
|
|
|
* expected to be in the coordinate space established by aFrame for its
|
|
|
|
* children (e.g. the space established by the 'viewBox' attribute on <svg>).
|
|
|
|
*/
|
2008-08-25 13:23:54 +04:00
|
|
|
static nsIFrame *
|
2014-08-07 11:09:31 +04:00
|
|
|
HitTestChildren(nsSVGDisplayContainerFrame *aFrame, const gfxPoint &aPoint);
|
2006-03-21 18:49:20 +03:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Returns the CanvasTM of the indicated frame, whether it's a
|
2008-09-11 04:24:16 +04:00
|
|
|
* child SVG frame, container SVG frame, or a regular frame.
|
|
|
|
* For regular frames, we just return an identity matrix.
|
2006-03-21 18:49:20 +03:00
|
|
|
*/
|
2014-09-08 15:28:50 +04:00
|
|
|
static gfxMatrix GetCanvasTM(nsIFrame* aFrame);
|
2006-03-21 18:49:20 +03:00
|
|
|
|
2012-06-26 14:49:23 +04:00
|
|
|
/**
|
|
|
|
* Returns the transform from aFrame's user space to canvas space. Only call
|
|
|
|
* with SVG frames. This is like GetCanvasTM, except that it only includes
|
|
|
|
* the transforms from aFrame's user space (i.e. the coordinate context
|
|
|
|
* established by its 'transform' attribute, or else the coordinate context
|
|
|
|
* that its _parent_ establishes for its children) to outer-<svg> device
|
|
|
|
* space. Specifically, it does not include any other transforms introduced
|
|
|
|
* by the frame such as x/y offsets and viewBox attributes.
|
|
|
|
*/
|
2014-09-08 15:28:50 +04:00
|
|
|
static gfxMatrix GetUserToCanvasTM(nsIFrame* aFrame);
|
2012-06-26 14:49:23 +04:00
|
|
|
|
2012-06-23 20:36:46 +04:00
|
|
|
/**
|
|
|
|
* Notify the descendants of aFrame of a change to one of their ancestors
|
|
|
|
* that might affect them.
|
2007-12-20 17:26:34 +03:00
|
|
|
*/
|
|
|
|
static void
|
2012-08-22 19:56:38 +04:00
|
|
|
NotifyChildrenOfSVGChange(nsIFrame *aFrame, uint32_t aFlags);
|
2007-12-20 17:26:34 +03:00
|
|
|
|
2006-05-12 01:24:59 +04:00
|
|
|
/*
|
|
|
|
* Get frame's covered region by walking the children and doing union.
|
|
|
|
*/
|
2006-06-09 22:08:33 +04:00
|
|
|
static nsRect
|
2006-05-12 01:24:59 +04:00
|
|
|
GetCoveredRegion(const nsFrameList &aFrames);
|
|
|
|
|
2012-02-10 16:33:46 +04:00
|
|
|
// Converts aPoint from an app unit point in outer-<svg> content rect space
|
|
|
|
// to an app unit point in a frame's SVG userspace.
|
|
|
|
// This is a temporary helper we should no longer need after bug 614732 is
|
|
|
|
// fixed.
|
|
|
|
static nsPoint
|
|
|
|
TransformOuterSVGPointToChildFrame(nsPoint aPoint,
|
|
|
|
const gfxMatrix& aFrameToCanvasTM,
|
|
|
|
nsPresContext* aPresContext);
|
|
|
|
|
|
|
|
static nsRect
|
|
|
|
TransformFrameRectToOuterSVG(const nsRect& aRect,
|
|
|
|
const gfxMatrix& aMatrix,
|
|
|
|
nsPresContext* aPresContext);
|
|
|
|
|
2007-06-13 13:02:48 +04:00
|
|
|
/*
|
|
|
|
* Convert a surface size to an integer for use by thebes
|
|
|
|
* possibly making it smaller in the process so the surface does not
|
|
|
|
* use excessive memory.
|
2010-09-09 00:40:39 +04:00
|
|
|
*
|
2007-06-13 13:02:48 +04:00
|
|
|
* @param aSize the desired surface size
|
|
|
|
* @param aResultOverflows true if the desired surface size is too big
|
|
|
|
* @return the surface size to use
|
|
|
|
*/
|
2010-09-09 00:40:39 +04:00
|
|
|
static gfxIntSize ConvertToSurfaceSize(const gfxSize& aSize,
|
2011-09-29 10:19:26 +04:00
|
|
|
bool *aResultOverflows);
|
2007-06-13 13:02:48 +04:00
|
|
|
|
2006-09-19 20:35:29 +04:00
|
|
|
/*
|
|
|
|
* Hit test a given rectangle/matrix.
|
|
|
|
*/
|
2011-09-29 10:19:26 +04:00
|
|
|
static bool
|
2013-12-31 01:42:26 +04:00
|
|
|
HitTestRect(const mozilla::gfx::Matrix &aMatrix,
|
2006-09-19 20:35:29 +04:00
|
|
|
float aRX, float aRY, float aRWidth, float aRHeight,
|
|
|
|
float aX, float aY);
|
|
|
|
|
2006-09-27 02:27:56 +04:00
|
|
|
|
2009-06-18 00:51:40 +04:00
|
|
|
/**
|
|
|
|
* Get the clip rect for the given frame, taking into account the CSS 'clip'
|
|
|
|
* property. See:
|
|
|
|
* http://www.w3.org/TR/SVG11/masking.html#OverflowAndClipProperties
|
|
|
|
* The arguments for aX, aY, aWidth and aHeight should be the dimensions of
|
|
|
|
* the viewport established by aFrame.
|
|
|
|
*/
|
|
|
|
static gfxRect
|
|
|
|
GetClipRectForFrame(nsIFrame *aFrame,
|
|
|
|
float aX, float aY, float aWidth, float aHeight);
|
|
|
|
|
2006-11-27 20:30:57 +03:00
|
|
|
static void SetClipRect(gfxContext *aContext,
|
2009-06-18 15:31:25 +04:00
|
|
|
const gfxMatrix &aCTM,
|
2009-06-18 00:51:40 +04:00
|
|
|
const gfxRect &aRect);
|
2006-11-27 20:30:57 +03:00
|
|
|
|
2007-01-04 18:05:39 +03:00
|
|
|
/* Using group opacity instead of fill or stroke opacity on a
|
|
|
|
* geometry object seems to be a common authoring mistake. If we're
|
|
|
|
* not applying filters and not both stroking and filling, we can
|
|
|
|
* generate the same result without going through the overhead of a
|
|
|
|
* push/pop group. */
|
2011-09-29 10:19:26 +04:00
|
|
|
static bool
|
2007-01-04 18:05:39 +03:00
|
|
|
CanOptimizeOpacity(nsIFrame *aFrame);
|
|
|
|
|
2009-06-11 19:21:03 +04:00
|
|
|
/**
|
|
|
|
* Take the CTM to userspace for an element, and adjust it to a CTM to its
|
|
|
|
* object bounding box space if aUnits is SVG_UNIT_TYPE_OBJECTBOUNDINGBOX.
|
|
|
|
* (I.e. so that [0,0] is at the top left of its bbox, and [1,1] is at the
|
|
|
|
* bottom right of its bbox).
|
|
|
|
*
|
|
|
|
* If the bbox is empty, this will return a singular matrix.
|
|
|
|
*/
|
2009-07-23 12:35:59 +04:00
|
|
|
static gfxMatrix
|
|
|
|
AdjustMatrixForUnits(const gfxMatrix &aMatrix,
|
2007-12-04 07:40:52 +03:00
|
|
|
nsSVGEnum *aUnits,
|
2008-09-11 04:24:16 +04:00
|
|
|
nsIFrame *aFrame);
|
|
|
|
|
2011-09-30 13:25:37 +04:00
|
|
|
enum BBoxFlags {
|
2012-07-11 15:25:27 +04:00
|
|
|
eBBoxIncludeFill = 1 << 0,
|
|
|
|
eBBoxIncludeFillGeometry = 1 << 1,
|
|
|
|
eBBoxIncludeStroke = 1 << 2,
|
|
|
|
eBBoxIncludeStrokeGeometry = 1 << 3,
|
2014-05-13 05:24:35 +04:00
|
|
|
eBBoxIncludeMarkers = 1 << 4,
|
|
|
|
eBBoxIncludeClipped = 1 << 5
|
2011-09-30 13:25:37 +04:00
|
|
|
};
|
2008-09-11 04:24:16 +04:00
|
|
|
/**
|
2011-09-30 13:25:37 +04:00
|
|
|
* Get the SVG bbox (the SVG spec's simplified idea of bounds) of aFrame in
|
|
|
|
* aFrame's userspace.
|
2008-09-11 04:24:16 +04:00
|
|
|
*/
|
2012-07-11 15:25:27 +04:00
|
|
|
static gfxRect GetBBox(nsIFrame *aFrame,
|
2012-08-22 19:56:38 +04:00
|
|
|
uint32_t aFlags = eBBoxIncludeFillGeometry);
|
2011-09-30 13:25:37 +04:00
|
|
|
|
2014-04-23 13:47:42 +04:00
|
|
|
/*
|
|
|
|
* "User space" is the space that the frame's BBox (as calculated by
|
|
|
|
* nsSVGUtils::GetBBox) is in. "Frame space" is the space that has its origin
|
|
|
|
* at the top left of the union of the frame's border-box rects over all
|
|
|
|
* continuations.
|
|
|
|
* This function returns the offset one needs to add to something in frame
|
|
|
|
* space in order to get its coordinates in user space.
|
|
|
|
*/
|
|
|
|
static gfxPoint FrameSpaceInCSSPxToUserSpaceOffset(nsIFrame *aFrame);
|
|
|
|
|
2008-09-11 04:24:16 +04:00
|
|
|
/**
|
2012-04-13 17:22:06 +04:00
|
|
|
* Convert a userSpaceOnUse/objectBoundingBoxUnits rectangle that's specified
|
|
|
|
* using four nsSVGLength2 values into a user unit rectangle in user space.
|
|
|
|
*
|
2008-09-11 04:24:16 +04:00
|
|
|
* @param aXYWH pointer to 4 consecutive nsSVGLength2 objects containing
|
|
|
|
* the x, y, width and height values in that order
|
|
|
|
* @param aBBox the bounding box of the object the rect is relative to;
|
|
|
|
* may be null if aUnits is not SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
|
|
|
|
* @param aFrame the object in which to interpret user-space units;
|
|
|
|
* may be null if aUnits is SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
|
|
|
|
*/
|
|
|
|
static gfxRect
|
2012-08-22 19:56:38 +04:00
|
|
|
GetRelativeRect(uint16_t aUnits, const nsSVGLength2 *aXYWH,
|
2014-09-15 14:12:50 +04:00
|
|
|
const gfxRect& aBBox, nsIFrame *aFrame);
|
|
|
|
|
|
|
|
static gfxRect
|
|
|
|
GetRelativeRect(uint16_t aUnits, const nsSVGLength2 *aXYWH,
|
|
|
|
const gfxRect& aBBox,
|
|
|
|
const mozilla::dom::UserSpaceMetrics& aMetrics);
|
2007-12-04 07:40:52 +03:00
|
|
|
|
2009-01-19 21:31:34 +03:00
|
|
|
/**
|
|
|
|
* Find the first frame, starting with aStartFrame and going up its
|
|
|
|
* parent chain, that is not an svgAFrame.
|
|
|
|
*/
|
|
|
|
static nsIFrame* GetFirstNonAAncestorFrame(nsIFrame* aStartFrame);
|
|
|
|
|
2012-07-22 04:01:44 +04:00
|
|
|
static bool OuterSVGIsCallingReflowSVG(nsIFrame *aFrame);
|
2013-06-03 18:15:29 +04:00
|
|
|
static bool AnyOuterSVGIsCallingReflowSVG(nsIFrame *aFrame);
|
2007-09-17 19:20:35 +04:00
|
|
|
|
2012-05-18 12:34:25 +04:00
|
|
|
/*
|
|
|
|
* Get any additional transforms that apply only to stroking
|
|
|
|
* e.g. non-scaling-stroke
|
|
|
|
*/
|
|
|
|
static gfxMatrix GetStrokeTransform(nsIFrame *aFrame);
|
|
|
|
|
2009-03-31 16:19:39 +04:00
|
|
|
/**
|
|
|
|
* Compute the maximum possible device space stroke extents of a path given
|
|
|
|
* the path's device space path extents, its stroke style and its ctm.
|
|
|
|
*
|
|
|
|
* This is a workaround for the lack of suitable cairo API for getting the
|
|
|
|
* tight device space stroke extents of a path. This basically gives us the
|
|
|
|
* tightest extents that we can guarantee fully enclose the inked stroke
|
|
|
|
* without doing the calculations for the actual tight extents. We exploit
|
|
|
|
* the fact that cairo does have an API for getting the tight device space
|
|
|
|
* fill/path extents.
|
|
|
|
*
|
|
|
|
* This should die once bug 478152 is fixed.
|
|
|
|
*/
|
2012-08-10 15:13:44 +04:00
|
|
|
static gfxRect PathExtentsToMaxStrokeExtents(const gfxRect& aPathExtents,
|
|
|
|
nsTextFrame* aFrame,
|
|
|
|
const gfxMatrix& aMatrix);
|
2011-09-05 21:53:34 +04:00
|
|
|
static gfxRect PathExtentsToMaxStrokeExtents(const gfxRect& aPathExtents,
|
2012-02-10 16:33:39 +04:00
|
|
|
nsSVGPathGeometryFrame* aFrame,
|
|
|
|
const gfxMatrix& aMatrix);
|
2009-03-31 16:19:39 +04:00
|
|
|
|
2010-09-09 00:40:39 +04:00
|
|
|
/**
|
|
|
|
* Convert a floating-point value to a 32-bit integer value, clamping to
|
|
|
|
* the range of valid integers.
|
|
|
|
*/
|
2012-08-22 19:56:38 +04:00
|
|
|
static int32_t ClampToInt(double aVal)
|
2010-09-09 00:40:39 +04:00
|
|
|
{
|
2013-01-15 16:22:03 +04:00
|
|
|
return NS_lround(std::max(double(INT32_MIN),
|
|
|
|
std::min(double(INT32_MAX), aVal)));
|
2010-09-09 00:40:39 +04:00
|
|
|
}
|
|
|
|
|
2014-09-28 13:06:22 +04:00
|
|
|
static nscolor GetFallbackOrPaintColor(nsStyleContext *aStyleContext,
|
2012-08-05 23:10:21 +04:00
|
|
|
nsStyleSVGPaint nsStyleSVG::*aFillOrStroke);
|
|
|
|
|
2012-09-06 08:58:46 +04:00
|
|
|
/**
|
|
|
|
* Set up cairo context with an object pattern
|
|
|
|
*/
|
2013-05-16 06:35:12 +04:00
|
|
|
static bool SetupContextPaint(gfxContext *aContext,
|
|
|
|
gfxTextContextPaint *aContextPaint,
|
|
|
|
const nsStyleSVGPaint& aPaint,
|
|
|
|
float aOpacity);
|
2012-09-06 08:58:46 +04:00
|
|
|
|
2012-08-05 23:10:21 +04:00
|
|
|
/**
|
2012-08-10 15:13:43 +04:00
|
|
|
* Sets the current paint on the specified gfxContent to be the SVG 'fill'
|
|
|
|
* for the given frame.
|
|
|
|
*/
|
2012-09-06 08:58:46 +04:00
|
|
|
static bool SetupCairoFillPaint(nsIFrame* aFrame, gfxContext* aContext,
|
2013-05-16 06:35:12 +04:00
|
|
|
gfxTextContextPaint *aContextPaint = nullptr);
|
2012-08-10 15:13:43 +04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Sets the current paint on the specified gfxContent to be the SVG 'stroke'
|
|
|
|
* for the given frame.
|
|
|
|
*/
|
2012-09-06 08:58:46 +04:00
|
|
|
static bool SetupCairoStrokePaint(nsIFrame* aFrame, gfxContext* aContext,
|
2013-05-16 06:35:12 +04:00
|
|
|
gfxTextContextPaint *aContextPaint = nullptr);
|
2012-08-10 15:13:43 +04:00
|
|
|
|
2012-09-06 08:58:47 +04:00
|
|
|
static float GetOpacity(nsStyleSVGOpacitySource aOpacityType,
|
|
|
|
const float& aOpacity,
|
2013-05-16 06:35:12 +04:00
|
|
|
gfxTextContextPaint *aOuterContextPaint);
|
2012-09-06 08:58:47 +04:00
|
|
|
|
2012-08-10 15:13:43 +04:00
|
|
|
/*
|
|
|
|
* @return false if there is no stroke
|
|
|
|
*/
|
2012-09-06 08:58:47 +04:00
|
|
|
static bool HasStroke(nsIFrame* aFrame,
|
2013-05-16 06:35:12 +04:00
|
|
|
gfxTextContextPaint *aContextPaint = nullptr);
|
2012-08-10 15:13:43 +04:00
|
|
|
|
2012-09-06 08:58:47 +04:00
|
|
|
static float GetStrokeWidth(nsIFrame* aFrame,
|
2013-05-16 06:35:12 +04:00
|
|
|
gfxTextContextPaint *aContextPaint = nullptr);
|
2012-08-10 15:13:43 +04:00
|
|
|
|
|
|
|
/*
|
2013-06-25 10:05:31 +04:00
|
|
|
* Set up a cairo context for measuring the bounding box of a stroked path.
|
2012-08-10 15:13:43 +04:00
|
|
|
*/
|
2013-06-25 10:05:31 +04:00
|
|
|
static void SetupCairoStrokeBBoxGeometry(nsIFrame* aFrame,
|
|
|
|
gfxContext *aContext,
|
2013-05-16 06:35:12 +04:00
|
|
|
gfxTextContextPaint *aContextPaint = nullptr);
|
2012-08-10 15:13:43 +04:00
|
|
|
|
|
|
|
/*
|
2013-06-25 10:05:32 +04:00
|
|
|
* Set up a cairo context for a stroked path (including any dashing that
|
|
|
|
* applies).
|
2012-08-05 23:10:21 +04:00
|
|
|
*/
|
2013-06-25 10:05:32 +04:00
|
|
|
static void SetupCairoStrokeGeometry(nsIFrame* aFrame, gfxContext *aContext,
|
2013-05-16 06:35:12 +04:00
|
|
|
gfxTextContextPaint *aContextPaint = nullptr);
|
2012-08-10 15:13:43 +04:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Set up a cairo context for stroking, including setting up any stroke-related
|
|
|
|
* properties such as dashing and setting the current paint on the gfxContext.
|
|
|
|
*/
|
2012-09-06 08:58:46 +04:00
|
|
|
static bool SetupCairoStroke(nsIFrame* aFrame, gfxContext *aContext,
|
2013-05-16 06:35:12 +04:00
|
|
|
gfxTextContextPaint *aContextPaint = nullptr);
|
2012-08-10 15:13:43 +04:00
|
|
|
|
2012-08-05 23:10:21 +04:00
|
|
|
/**
|
2012-08-10 15:13:43 +04:00
|
|
|
* This function returns a set of bit flags indicating which parts of the
|
|
|
|
* element (fill, stroke, bounds) should intercept pointer events. It takes
|
|
|
|
* into account the type of element and the value of the 'pointer-events'
|
|
|
|
* property on the element.
|
2012-08-05 23:10:21 +04:00
|
|
|
*/
|
2012-08-22 19:56:38 +04:00
|
|
|
static uint16_t GetGeometryHitTestFlags(nsIFrame* aFrame);
|
2012-12-12 03:15:07 +04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Render a SVG glyph.
|
|
|
|
* @param aElement the SVG glyph element to render
|
|
|
|
* @param aContext the thebes aContext to draw to
|
2013-10-02 01:02:16 +04:00
|
|
|
* @param aDrawMode fill or stroke or both (see DrawMode)
|
2012-12-12 03:15:07 +04:00
|
|
|
* @return true if rendering succeeded
|
|
|
|
*/
|
|
|
|
static bool PaintSVGGlyph(Element* aElement, gfxContext* aContext,
|
2013-10-02 01:02:16 +04:00
|
|
|
DrawMode aDrawMode,
|
2013-05-16 06:35:12 +04:00
|
|
|
gfxTextContextPaint* aContextPaint);
|
2012-12-12 03:15:07 +04:00
|
|
|
/**
|
|
|
|
* Get the extents of a SVG glyph.
|
|
|
|
* @param aElement the SVG glyph element
|
|
|
|
* @param aSVGToAppSpace the matrix mapping the SVG glyph space to the
|
|
|
|
* target context space
|
|
|
|
* @param aResult the result (valid when true is returned)
|
|
|
|
* @return true if calculating the extents succeeded
|
|
|
|
*/
|
|
|
|
static bool GetSVGGlyphExtents(Element* aElement,
|
|
|
|
const gfxMatrix& aSVGToAppSpace,
|
|
|
|
gfxRect* aResult);
|
2013-02-11 10:22:18 +04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the app unit canvas bounds of a userspace rect.
|
|
|
|
*
|
|
|
|
* @param aToCanvas Transform from userspace to canvas device space.
|
|
|
|
*/
|
|
|
|
static nsRect
|
|
|
|
ToCanvasBounds(const gfxRect &aUserspaceRect,
|
|
|
|
const gfxMatrix &aToCanvas,
|
|
|
|
const nsPresContext *presContext);
|
2005-04-05 01:42:26 +04:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|