2015-05-03 22:32:37 +03:00
|
|
|
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
|
|
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
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/. */
|
2001-12-12 10:59:31 +03:00
|
|
|
|
2013-08-02 11:04:22 +04:00
|
|
|
#include "mozilla/dom/SVGPathElement.h"
|
|
|
|
|
|
|
|
#include <algorithm>
|
|
|
|
|
2010-11-08 18:07:00 +03:00
|
|
|
#include "DOMSVGPathSeg.h"
|
|
|
|
#include "DOMSVGPathSegList.h"
|
2010-12-08 15:15:53 +03:00
|
|
|
#include "DOMSVGPoint.h"
|
2013-11-18 05:29:06 +04:00
|
|
|
#include "gfx2DGlue.h"
|
2014-07-06 00:53:04 +04:00
|
|
|
#include "gfxPlatform.h"
|
2013-01-17 00:50:59 +04:00
|
|
|
#include "mozilla/dom/SVGPathElementBinding.h"
|
2013-11-18 05:29:06 +04:00
|
|
|
#include "mozilla/gfx/2D.h"
|
2015-10-18 08:24:48 +03:00
|
|
|
#include "mozilla/RefPtr.h"
|
2013-08-02 11:04:22 +04:00
|
|
|
#include "nsCOMPtr.h"
|
2013-11-02 15:10:38 +04:00
|
|
|
#include "nsComputedDOMStyle.h"
|
2013-08-02 11:04:22 +04:00
|
|
|
#include "nsGkAtoms.h"
|
2013-11-02 15:10:38 +04:00
|
|
|
#include "nsStyleConsts.h"
|
|
|
|
#include "nsStyleStruct.h"
|
|
|
|
#include "SVGContentUtils.h"
|
2001-12-12 10:59:31 +03:00
|
|
|
|
2013-01-13 02:22:31 +04:00
|
|
|
NS_IMPL_NS_NEW_NAMESPACED_SVG_ELEMENT(Path)
|
|
|
|
|
2013-11-02 15:10:38 +04:00
|
|
|
using namespace mozilla::gfx;
|
|
|
|
|
2013-01-13 02:22:31 +04:00
|
|
|
namespace mozilla {
|
|
|
|
namespace dom {
|
2006-07-28 22:10:48 +04:00
|
|
|
|
2013-01-17 00:50:59 +04:00
|
|
|
JSObject*
|
Bug 1117172 part 3. Change the wrappercached WrapObject methods to allow passing in aGivenProto. r=peterv
The only manual changes here are to BindingUtils.h, BindingUtils.cpp,
Codegen.py, Element.cpp, IDBFileRequest.cpp, IDBObjectStore.cpp,
dom/workers/Navigator.cpp, WorkerPrivate.cpp, DeviceStorageRequestChild.cpp,
Notification.cpp, nsGlobalWindow.cpp, MessagePort.cpp, nsJSEnvironment.cpp,
Sandbox.cpp, XPCConvert.cpp, ExportHelpers.cpp, and DataStoreService.cpp. The
rest of this diff was generated by running the following commands:
find . -name "*.h" -o -name "*.cpp" | xargs perl -pi -e 'BEGIN { $/ = undef } s/(WrapObjectInternal\(JSContext *\* *(?:aCx|cx|aContext|aCtx|js))\)/\1, JS::Handle<JSObject*> aGivenProto)/g'
find . -name "*.h" -o -name "*.cpp" | xargs perl -pi -e 'BEGIN { $/ = undef } s/(WrapObjectInternal\((?:aCx|cx|aContext|aCtx|js))\)/\1, aGivenProto)/g'
find . -name "*.h" -o -name "*.cpp" | xargs perl -pi -e 'BEGIN { $/ = undef } s/(WrapNode\(JSContext *\* *(?:aCx|cx|aContext|aCtx|js))\)/\1, JS::Handle<JSObject*> aGivenProto)/g'
find . -name "*.h" -o -name "*.cpp" | xargs perl -pi -e 'BEGIN { $/ = undef } s/(WrapNode\((?:aCx|cx|aContext|aCtx|js))\)/\1, aGivenProto)/g'
find . -name "*.h" -o -name "*.cpp" | xargs perl -pi -e 'BEGIN { $/ = undef } s/(WrapObject\(JSContext *\* *(?:aCx|cx|aContext|aCtx|js))\)/\1, JS::Handle<JSObject*> aGivenProto)/g'
find . -name "*.h" -o -name "*.cpp" | xargs perl -pi -e 'BEGIN { $/ = undef } s/(Binding(?:_workers)?::Wrap\((?:aCx|cx|aContext|aCtx|js), [^,)]+)\)/\1, aGivenProto)/g'
2015-03-19 17:13:33 +03:00
|
|
|
SVGPathElement::WrapNode(JSContext *aCx, JS::Handle<JSObject*> aGivenProto)
|
2013-01-17 00:50:59 +04:00
|
|
|
{
|
Bug 1117172 part 3. Change the wrappercached WrapObject methods to allow passing in aGivenProto. r=peterv
The only manual changes here are to BindingUtils.h, BindingUtils.cpp,
Codegen.py, Element.cpp, IDBFileRequest.cpp, IDBObjectStore.cpp,
dom/workers/Navigator.cpp, WorkerPrivate.cpp, DeviceStorageRequestChild.cpp,
Notification.cpp, nsGlobalWindow.cpp, MessagePort.cpp, nsJSEnvironment.cpp,
Sandbox.cpp, XPCConvert.cpp, ExportHelpers.cpp, and DataStoreService.cpp. The
rest of this diff was generated by running the following commands:
find . -name "*.h" -o -name "*.cpp" | xargs perl -pi -e 'BEGIN { $/ = undef } s/(WrapObjectInternal\(JSContext *\* *(?:aCx|cx|aContext|aCtx|js))\)/\1, JS::Handle<JSObject*> aGivenProto)/g'
find . -name "*.h" -o -name "*.cpp" | xargs perl -pi -e 'BEGIN { $/ = undef } s/(WrapObjectInternal\((?:aCx|cx|aContext|aCtx|js))\)/\1, aGivenProto)/g'
find . -name "*.h" -o -name "*.cpp" | xargs perl -pi -e 'BEGIN { $/ = undef } s/(WrapNode\(JSContext *\* *(?:aCx|cx|aContext|aCtx|js))\)/\1, JS::Handle<JSObject*> aGivenProto)/g'
find . -name "*.h" -o -name "*.cpp" | xargs perl -pi -e 'BEGIN { $/ = undef } s/(WrapNode\((?:aCx|cx|aContext|aCtx|js))\)/\1, aGivenProto)/g'
find . -name "*.h" -o -name "*.cpp" | xargs perl -pi -e 'BEGIN { $/ = undef } s/(WrapObject\(JSContext *\* *(?:aCx|cx|aContext|aCtx|js))\)/\1, JS::Handle<JSObject*> aGivenProto)/g'
find . -name "*.h" -o -name "*.cpp" | xargs perl -pi -e 'BEGIN { $/ = undef } s/(Binding(?:_workers)?::Wrap\((?:aCx|cx|aContext|aCtx|js), [^,)]+)\)/\1, aGivenProto)/g'
2015-03-19 17:13:33 +03:00
|
|
|
return SVGPathElementBinding::Wrap(aCx, this, aGivenProto);
|
2013-01-17 00:50:59 +04:00
|
|
|
}
|
|
|
|
|
2013-01-13 02:22:31 +04:00
|
|
|
nsSVGElement::NumberInfo SVGPathElement::sNumberInfo =
|
|
|
|
{ &nsGkAtoms::pathLength, 0, false };
|
2001-12-12 10:59:31 +03:00
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
// Implementation
|
|
|
|
|
2014-06-20 06:01:40 +04:00
|
|
|
SVGPathElement::SVGPathElement(already_AddRefed<mozilla::dom::NodeInfo>& aNodeInfo)
|
2013-01-13 02:22:31 +04:00
|
|
|
: SVGPathElementBase(aNodeInfo)
|
2001-12-12 10:59:31 +03:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2014-05-26 19:21:23 +04:00
|
|
|
//----------------------------------------------------------------------
|
|
|
|
// memory reporting methods
|
|
|
|
|
|
|
|
size_t
|
|
|
|
SVGPathElement::SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
|
|
|
|
{
|
|
|
|
return SVGPathElementBase::SizeOfExcludingThis(aMallocSizeOf) +
|
|
|
|
mD.SizeOfExcludingThis(aMallocSizeOf);
|
|
|
|
}
|
|
|
|
|
2001-12-12 10:59:31 +03:00
|
|
|
//----------------------------------------------------------------------
|
|
|
|
// nsIDOMNode methods
|
|
|
|
|
2013-01-13 02:22:31 +04:00
|
|
|
NS_IMPL_ELEMENT_CLONE_WITH_INIT(SVGPathElement)
|
2001-12-12 10:59:31 +03:00
|
|
|
|
2013-07-01 11:03:04 +04:00
|
|
|
already_AddRefed<SVGAnimatedNumber>
|
2013-01-17 00:50:59 +04:00
|
|
|
SVGPathElement::PathLength()
|
|
|
|
{
|
2013-07-01 11:03:04 +04:00
|
|
|
return mPathLength.ToDOMAnimatedNumber(this);
|
2001-12-12 10:59:31 +03:00
|
|
|
}
|
|
|
|
|
2013-01-17 00:50:59 +04:00
|
|
|
float
|
2014-07-03 22:50:42 +04:00
|
|
|
SVGPathElement::GetTotalLength()
|
2013-01-17 00:50:59 +04:00
|
|
|
{
|
2015-10-18 08:24:48 +03:00
|
|
|
RefPtr<Path> flat = GetOrBuildPathForMeasuring();
|
2014-07-03 22:50:42 +04:00
|
|
|
return flat ? flat->ComputeLength() : 0.f;
|
2001-12-12 10:59:31 +03:00
|
|
|
}
|
|
|
|
|
2013-01-17 00:50:59 +04:00
|
|
|
already_AddRefed<nsISVGPoint>
|
|
|
|
SVGPathElement::GetPointAtLength(float distance, ErrorResult& rv)
|
|
|
|
{
|
2015-10-18 08:24:48 +03:00
|
|
|
RefPtr<Path> path = GetOrBuildPathForMeasuring();
|
2013-11-18 05:29:06 +04:00
|
|
|
if (!path) {
|
2013-01-17 00:50:59 +04:00
|
|
|
rv.Throw(NS_ERROR_FAILURE);
|
|
|
|
return nullptr;
|
|
|
|
}
|
2006-07-18 20:16:09 +04:00
|
|
|
|
2013-11-18 05:29:06 +04:00
|
|
|
float totalLength = path->ComputeLength();
|
2011-05-01 22:26:20 +04:00
|
|
|
if (mPathLength.IsExplicitlySet()) {
|
2010-02-25 21:20:43 +03:00
|
|
|
float pathLength = mPathLength.GetAnimValue();
|
2011-05-01 22:26:20 +04:00
|
|
|
if (pathLength <= 0) {
|
2013-01-17 00:50:59 +04:00
|
|
|
rv.Throw(NS_ERROR_FAILURE);
|
|
|
|
return nullptr;
|
2011-05-01 22:26:20 +04:00
|
|
|
}
|
2006-07-18 20:16:09 +04:00
|
|
|
distance *= totalLength / pathLength;
|
|
|
|
}
|
2013-01-15 16:22:03 +04:00
|
|
|
distance = std::max(0.f, distance);
|
|
|
|
distance = std::min(totalLength, distance);
|
2006-07-28 22:10:48 +04:00
|
|
|
|
2013-11-18 05:29:06 +04:00
|
|
|
nsCOMPtr<nsISVGPoint> point =
|
|
|
|
new DOMSVGPoint(path->ComputePointAtLength(distance));
|
2013-01-17 00:50:59 +04:00
|
|
|
return point.forget();
|
2001-12-12 10:59:31 +03:00
|
|
|
}
|
|
|
|
|
2013-01-17 00:50:59 +04:00
|
|
|
uint32_t
|
|
|
|
SVGPathElement::GetPathSegAtLength(float distance)
|
|
|
|
{
|
|
|
|
return mD.GetAnimValue().GetPathSegAtLength(distance);
|
|
|
|
}
|
|
|
|
|
|
|
|
already_AddRefed<DOMSVGPathSegClosePath>
|
|
|
|
SVGPathElement::CreateSVGPathSegClosePath()
|
|
|
|
{
|
2015-10-18 08:24:48 +03:00
|
|
|
RefPtr<DOMSVGPathSegClosePath> pathSeg = new DOMSVGPathSegClosePath();
|
2013-01-17 00:50:59 +04:00
|
|
|
return pathSeg.forget();
|
2001-12-12 10:59:31 +03:00
|
|
|
}
|
|
|
|
|
2013-01-17 00:50:59 +04:00
|
|
|
already_AddRefed<DOMSVGPathSegMovetoAbs>
|
|
|
|
SVGPathElement::CreateSVGPathSegMovetoAbs(float x, float y)
|
|
|
|
{
|
2015-10-18 08:24:48 +03:00
|
|
|
RefPtr<DOMSVGPathSegMovetoAbs> pathSeg = new DOMSVGPathSegMovetoAbs(x, y);
|
2013-01-17 00:50:59 +04:00
|
|
|
return pathSeg.forget();
|
2001-12-12 10:59:31 +03:00
|
|
|
}
|
|
|
|
|
2013-01-17 00:50:59 +04:00
|
|
|
already_AddRefed<DOMSVGPathSegMovetoRel>
|
|
|
|
SVGPathElement::CreateSVGPathSegMovetoRel(float x, float y)
|
|
|
|
{
|
2015-10-18 08:24:48 +03:00
|
|
|
RefPtr<DOMSVGPathSegMovetoRel> pathSeg = new DOMSVGPathSegMovetoRel(x, y);
|
2013-01-17 00:50:59 +04:00
|
|
|
return pathSeg.forget();
|
2001-12-12 10:59:31 +03:00
|
|
|
}
|
|
|
|
|
2013-01-17 00:50:59 +04:00
|
|
|
already_AddRefed<DOMSVGPathSegLinetoAbs>
|
|
|
|
SVGPathElement::CreateSVGPathSegLinetoAbs(float x, float y)
|
|
|
|
{
|
2015-10-18 08:24:48 +03:00
|
|
|
RefPtr<DOMSVGPathSegLinetoAbs> pathSeg = new DOMSVGPathSegLinetoAbs(x, y);
|
2013-01-17 00:50:59 +04:00
|
|
|
return pathSeg.forget();
|
2001-12-12 10:59:31 +03:00
|
|
|
}
|
|
|
|
|
2013-01-17 00:50:59 +04:00
|
|
|
already_AddRefed<DOMSVGPathSegLinetoRel>
|
|
|
|
SVGPathElement::CreateSVGPathSegLinetoRel(float x, float y)
|
|
|
|
{
|
2015-10-18 08:24:48 +03:00
|
|
|
RefPtr<DOMSVGPathSegLinetoRel> pathSeg = new DOMSVGPathSegLinetoRel(x, y);
|
2013-01-17 00:50:59 +04:00
|
|
|
return pathSeg.forget();
|
2001-12-12 10:59:31 +03:00
|
|
|
}
|
|
|
|
|
2013-01-17 00:50:59 +04:00
|
|
|
already_AddRefed<DOMSVGPathSegCurvetoCubicAbs>
|
|
|
|
SVGPathElement::CreateSVGPathSegCurvetoCubicAbs(float x, float y, float x1, float y1, float x2, float y2)
|
|
|
|
{
|
|
|
|
// Note that we swap from DOM API argument order to the argument order used
|
|
|
|
// in the <path> element's 'd' attribute (i.e. we put the arguments for the
|
|
|
|
// end point of the segment last instead of first).
|
2015-10-18 08:24:48 +03:00
|
|
|
RefPtr<DOMSVGPathSegCurvetoCubicAbs> pathSeg =
|
2013-01-17 00:50:59 +04:00
|
|
|
new DOMSVGPathSegCurvetoCubicAbs(x1, y1, x2, y2, x, y);
|
|
|
|
return pathSeg.forget();
|
2001-12-12 10:59:31 +03:00
|
|
|
}
|
|
|
|
|
2013-01-17 00:50:59 +04:00
|
|
|
already_AddRefed<DOMSVGPathSegCurvetoCubicRel>
|
|
|
|
SVGPathElement::CreateSVGPathSegCurvetoCubicRel(float x, float y, float x1, float y1, float x2, float y2)
|
|
|
|
{
|
|
|
|
// See comment in CreateSVGPathSegCurvetoCubicAbs
|
2015-10-18 08:24:48 +03:00
|
|
|
RefPtr<DOMSVGPathSegCurvetoCubicRel> pathSeg =
|
2013-01-17 00:50:59 +04:00
|
|
|
new DOMSVGPathSegCurvetoCubicRel(x1, y1, x2, y2, x, y);
|
|
|
|
return pathSeg.forget();
|
2001-12-12 10:59:31 +03:00
|
|
|
}
|
|
|
|
|
2013-01-17 00:50:59 +04:00
|
|
|
already_AddRefed<DOMSVGPathSegCurvetoQuadraticAbs>
|
|
|
|
SVGPathElement::CreateSVGPathSegCurvetoQuadraticAbs(float x, float y, float x1, float y1)
|
|
|
|
{
|
|
|
|
// See comment in CreateSVGPathSegCurvetoCubicAbs
|
2015-10-18 08:24:48 +03:00
|
|
|
RefPtr<DOMSVGPathSegCurvetoQuadraticAbs> pathSeg =
|
2013-01-17 00:50:59 +04:00
|
|
|
new DOMSVGPathSegCurvetoQuadraticAbs(x1, y1, x, y);
|
|
|
|
return pathSeg.forget();
|
2001-12-12 10:59:31 +03:00
|
|
|
}
|
|
|
|
|
2013-01-17 00:50:59 +04:00
|
|
|
already_AddRefed<DOMSVGPathSegCurvetoQuadraticRel>
|
|
|
|
SVGPathElement::CreateSVGPathSegCurvetoQuadraticRel(float x, float y, float x1, float y1)
|
|
|
|
{
|
|
|
|
// See comment in CreateSVGPathSegCurvetoCubicAbs
|
2015-10-18 08:24:48 +03:00
|
|
|
RefPtr<DOMSVGPathSegCurvetoQuadraticRel> pathSeg =
|
2013-01-17 00:50:59 +04:00
|
|
|
new DOMSVGPathSegCurvetoQuadraticRel(x1, y1, x, y);
|
|
|
|
return pathSeg.forget();
|
2001-12-12 10:59:31 +03:00
|
|
|
}
|
|
|
|
|
2013-01-17 00:50:59 +04:00
|
|
|
already_AddRefed<DOMSVGPathSegArcAbs>
|
|
|
|
SVGPathElement::CreateSVGPathSegArcAbs(float x, float y, float r1, float r2, float angle, bool largeArcFlag, bool sweepFlag)
|
|
|
|
{
|
|
|
|
// See comment in CreateSVGPathSegCurvetoCubicAbs
|
2015-10-18 08:24:48 +03:00
|
|
|
RefPtr<DOMSVGPathSegArcAbs> pathSeg =
|
2013-01-17 00:50:59 +04:00
|
|
|
new DOMSVGPathSegArcAbs(r1, r2, angle, largeArcFlag, sweepFlag, x, y);
|
|
|
|
return pathSeg.forget();
|
2001-12-12 10:59:31 +03:00
|
|
|
}
|
|
|
|
|
2013-01-17 00:50:59 +04:00
|
|
|
already_AddRefed<DOMSVGPathSegArcRel>
|
|
|
|
SVGPathElement::CreateSVGPathSegArcRel(float x, float y, float r1, float r2, float angle, bool largeArcFlag, bool sweepFlag)
|
|
|
|
{
|
|
|
|
// See comment in CreateSVGPathSegCurvetoCubicAbs
|
2015-10-18 08:24:48 +03:00
|
|
|
RefPtr<DOMSVGPathSegArcRel> pathSeg =
|
2013-01-17 00:50:59 +04:00
|
|
|
new DOMSVGPathSegArcRel(r1, r2, angle, largeArcFlag, sweepFlag, x, y);
|
|
|
|
return pathSeg.forget();
|
2001-12-12 10:59:31 +03:00
|
|
|
}
|
|
|
|
|
2013-01-17 00:50:59 +04:00
|
|
|
already_AddRefed<DOMSVGPathSegLinetoHorizontalAbs>
|
|
|
|
SVGPathElement::CreateSVGPathSegLinetoHorizontalAbs(float x)
|
|
|
|
{
|
2015-10-18 08:24:48 +03:00
|
|
|
RefPtr<DOMSVGPathSegLinetoHorizontalAbs> pathSeg =
|
2013-01-17 00:50:59 +04:00
|
|
|
new DOMSVGPathSegLinetoHorizontalAbs(x);
|
|
|
|
return pathSeg.forget();
|
2001-12-12 10:59:31 +03:00
|
|
|
}
|
|
|
|
|
2013-01-17 00:50:59 +04:00
|
|
|
already_AddRefed<DOMSVGPathSegLinetoHorizontalRel>
|
|
|
|
SVGPathElement::CreateSVGPathSegLinetoHorizontalRel(float x)
|
|
|
|
{
|
2015-10-18 08:24:48 +03:00
|
|
|
RefPtr<DOMSVGPathSegLinetoHorizontalRel> pathSeg =
|
2013-01-17 00:50:59 +04:00
|
|
|
new DOMSVGPathSegLinetoHorizontalRel(x);
|
|
|
|
return pathSeg.forget();
|
2001-12-12 10:59:31 +03:00
|
|
|
}
|
|
|
|
|
2013-01-17 00:50:59 +04:00
|
|
|
already_AddRefed<DOMSVGPathSegLinetoVerticalAbs>
|
|
|
|
SVGPathElement::CreateSVGPathSegLinetoVerticalAbs(float y)
|
|
|
|
{
|
2015-10-18 08:24:48 +03:00
|
|
|
RefPtr<DOMSVGPathSegLinetoVerticalAbs> pathSeg =
|
2013-01-17 00:50:59 +04:00
|
|
|
new DOMSVGPathSegLinetoVerticalAbs(y);
|
|
|
|
return pathSeg.forget();
|
2001-12-12 10:59:31 +03:00
|
|
|
}
|
|
|
|
|
2013-01-17 00:50:59 +04:00
|
|
|
already_AddRefed<DOMSVGPathSegLinetoVerticalRel>
|
|
|
|
SVGPathElement::CreateSVGPathSegLinetoVerticalRel(float y)
|
|
|
|
{
|
2015-10-18 08:24:48 +03:00
|
|
|
RefPtr<DOMSVGPathSegLinetoVerticalRel> pathSeg =
|
2013-01-17 00:50:59 +04:00
|
|
|
new DOMSVGPathSegLinetoVerticalRel(y);
|
|
|
|
return pathSeg.forget();
|
2001-12-12 10:59:31 +03:00
|
|
|
}
|
|
|
|
|
2013-01-17 00:50:59 +04:00
|
|
|
already_AddRefed<DOMSVGPathSegCurvetoCubicSmoothAbs>
|
|
|
|
SVGPathElement::CreateSVGPathSegCurvetoCubicSmoothAbs(float x, float y, float x2, float y2)
|
|
|
|
{
|
|
|
|
// See comment in CreateSVGPathSegCurvetoCubicAbs
|
2015-10-18 08:24:48 +03:00
|
|
|
RefPtr<DOMSVGPathSegCurvetoCubicSmoothAbs> pathSeg =
|
2013-01-17 00:50:59 +04:00
|
|
|
new DOMSVGPathSegCurvetoCubicSmoothAbs(x2, y2, x, y);
|
|
|
|
return pathSeg.forget();
|
2001-12-12 10:59:31 +03:00
|
|
|
}
|
|
|
|
|
2013-01-17 00:50:59 +04:00
|
|
|
already_AddRefed<DOMSVGPathSegCurvetoCubicSmoothRel>
|
|
|
|
SVGPathElement::CreateSVGPathSegCurvetoCubicSmoothRel(float x, float y, float x2, float y2)
|
|
|
|
{
|
|
|
|
// See comment in CreateSVGPathSegCurvetoCubicAbs
|
2015-10-18 08:24:48 +03:00
|
|
|
RefPtr<DOMSVGPathSegCurvetoCubicSmoothRel> pathSeg =
|
2013-01-17 00:50:59 +04:00
|
|
|
new DOMSVGPathSegCurvetoCubicSmoothRel(x2, y2, x, y);
|
|
|
|
return pathSeg.forget();
|
2001-12-12 10:59:31 +03:00
|
|
|
}
|
|
|
|
|
2013-01-17 00:50:59 +04:00
|
|
|
already_AddRefed<DOMSVGPathSegCurvetoQuadraticSmoothAbs>
|
|
|
|
SVGPathElement::CreateSVGPathSegCurvetoQuadraticSmoothAbs(float x, float y)
|
|
|
|
{
|
2015-10-18 08:24:48 +03:00
|
|
|
RefPtr<DOMSVGPathSegCurvetoQuadraticSmoothAbs> pathSeg =
|
2013-01-17 00:50:59 +04:00
|
|
|
new DOMSVGPathSegCurvetoQuadraticSmoothAbs(x, y);
|
|
|
|
return pathSeg.forget();
|
2001-12-12 10:59:31 +03:00
|
|
|
}
|
|
|
|
|
2013-01-17 00:50:59 +04:00
|
|
|
already_AddRefed<DOMSVGPathSegCurvetoQuadraticSmoothRel>
|
|
|
|
SVGPathElement::CreateSVGPathSegCurvetoQuadraticSmoothRel(float x, float y)
|
|
|
|
{
|
2015-10-18 08:24:48 +03:00
|
|
|
RefPtr<DOMSVGPathSegCurvetoQuadraticSmoothRel> pathSeg =
|
2013-01-17 00:50:59 +04:00
|
|
|
new DOMSVGPathSegCurvetoQuadraticSmoothRel(x, y);
|
|
|
|
return pathSeg.forget();
|
|
|
|
}
|
2006-07-28 22:10:48 +04:00
|
|
|
|
2013-01-17 00:50:59 +04:00
|
|
|
already_AddRefed<DOMSVGPathSegList>
|
|
|
|
SVGPathElement::PathSegList()
|
2012-03-03 13:21:09 +04:00
|
|
|
{
|
2013-01-17 00:50:59 +04:00
|
|
|
return DOMSVGPathSegList::GetDOMWrapper(mD.GetBaseValKey(), this, false);
|
2012-03-03 13:21:09 +04:00
|
|
|
}
|
|
|
|
|
2013-01-17 00:50:59 +04:00
|
|
|
already_AddRefed<DOMSVGPathSegList>
|
|
|
|
SVGPathElement::AnimatedPathSegList()
|
2006-07-28 22:10:48 +04:00
|
|
|
{
|
2013-01-17 00:50:59 +04:00
|
|
|
return DOMSVGPathSegList::GetDOMWrapper(mD.GetAnimValKey(), this, true);
|
2006-07-28 22:10:48 +04:00
|
|
|
}
|
|
|
|
|
2001-12-12 10:59:31 +03:00
|
|
|
//----------------------------------------------------------------------
|
2013-01-17 00:50:59 +04:00
|
|
|
// nsSVGElement methods
|
2001-12-12 10:59:31 +03:00
|
|
|
|
2013-01-17 00:50:59 +04:00
|
|
|
/* virtual */ bool
|
|
|
|
SVGPathElement::HasValidDimensions() const
|
2001-12-12 10:59:31 +03:00
|
|
|
{
|
2013-01-17 00:50:59 +04:00
|
|
|
return !mD.GetAnimValue().IsEmpty();
|
2001-12-12 10:59:31 +03:00
|
|
|
}
|
|
|
|
|
2013-01-17 00:50:59 +04:00
|
|
|
nsSVGElement::NumberAttributesInfo
|
|
|
|
SVGPathElement::GetNumberInfo()
|
2001-12-12 10:59:31 +03:00
|
|
|
{
|
2013-01-17 00:50:59 +04:00
|
|
|
return NumberAttributesInfo(&mPathLength, &sNumberInfo, 1);
|
2001-12-12 10:59:31 +03:00
|
|
|
}
|
|
|
|
|
2004-12-09 06:16:15 +03:00
|
|
|
//----------------------------------------------------------------------
|
2005-11-02 03:41:51 +03:00
|
|
|
// nsIContent methods
|
2004-12-09 06:16:15 +03:00
|
|
|
|
2011-09-29 10:19:26 +04:00
|
|
|
NS_IMETHODIMP_(bool)
|
2013-01-13 02:22:31 +04:00
|
|
|
SVGPathElement::IsAttributeMapped(const nsIAtom* name) const
|
2004-12-09 06:16:15 +03:00
|
|
|
{
|
|
|
|
static const MappedAttributeEntry* const map[] = {
|
2007-03-20 13:43:33 +03:00
|
|
|
sMarkersMap
|
2004-12-09 06:16:15 +03:00
|
|
|
};
|
2006-08-11 02:17:14 +04:00
|
|
|
|
2011-12-18 14:09:27 +04:00
|
|
|
return FindAttributeDependence(name, map) ||
|
2013-01-13 02:22:31 +04:00
|
|
|
SVGPathElementBase::IsAttributeMapped(name);
|
2004-12-09 06:16:15 +03:00
|
|
|
}
|
2005-08-26 06:49:52 +04:00
|
|
|
|
2015-06-17 17:00:52 +03:00
|
|
|
already_AddRefed<Path>
|
2014-10-04 15:13:30 +04:00
|
|
|
SVGPathElement::GetOrBuildPathForMeasuring()
|
2005-08-26 06:49:52 +04:00
|
|
|
{
|
2014-10-04 15:13:30 +04:00
|
|
|
return mD.GetAnimValue().BuildPathForMeasuring();
|
2005-08-26 06:49:52 +04:00
|
|
|
}
|
2006-05-03 21:01:28 +04:00
|
|
|
|
2006-06-21 19:42:28 +04:00
|
|
|
//----------------------------------------------------------------------
|
|
|
|
// nsSVGPathGeometryElement methods
|
|
|
|
|
2011-09-29 10:19:26 +04:00
|
|
|
bool
|
2013-01-13 02:22:31 +04:00
|
|
|
SVGPathElement::AttributeDefinesGeometry(const nsIAtom *aName)
|
2006-06-21 19:42:28 +04:00
|
|
|
{
|
2011-05-01 22:26:20 +04:00
|
|
|
return aName == nsGkAtoms::d ||
|
|
|
|
aName == nsGkAtoms::pathLength;
|
2006-06-21 19:42:28 +04:00
|
|
|
}
|
|
|
|
|
2011-09-29 10:19:26 +04:00
|
|
|
bool
|
2013-01-13 02:22:31 +04:00
|
|
|
SVGPathElement::IsMarkable()
|
2006-06-21 19:42:28 +04:00
|
|
|
{
|
2011-10-17 18:59:28 +04:00
|
|
|
return true;
|
2006-06-21 19:42:28 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2013-01-13 02:22:31 +04:00
|
|
|
SVGPathElement::GetMarkPoints(nsTArray<nsSVGMark> *aMarks)
|
2007-07-02 13:54:11 +04:00
|
|
|
{
|
2010-11-08 18:07:00 +03:00
|
|
|
mD.GetAnimValue().GetMarkerPositioningData(aMarks);
|
2006-06-21 19:42:28 +04:00
|
|
|
}
|
|
|
|
|
2014-03-19 05:13:19 +04:00
|
|
|
float
|
2013-01-13 02:22:31 +04:00
|
|
|
SVGPathElement::GetPathLengthScale(PathLengthScaleForType aFor)
|
2011-05-01 22:26:20 +04:00
|
|
|
{
|
2015-02-10 01:34:50 +03:00
|
|
|
MOZ_ASSERT(aFor == eForTextPath || aFor == eForStroking,
|
|
|
|
"Unknown enum");
|
2011-05-01 22:26:20 +04:00
|
|
|
if (mPathLength.IsExplicitlySet()) {
|
2011-11-22 01:22:19 +04:00
|
|
|
float authorsPathLengthEstimate = mPathLength.GetAnimValue();
|
|
|
|
if (authorsPathLengthEstimate > 0) {
|
2015-10-18 08:24:48 +03:00
|
|
|
RefPtr<Path> path = GetOrBuildPathForMeasuring();
|
2014-07-03 22:50:42 +04:00
|
|
|
if (!path) {
|
|
|
|
// The path is empty or invalid so its length must be zero and
|
|
|
|
// we know that 0 / authorsPathLengthEstimate = 0.
|
|
|
|
return 0.0;
|
|
|
|
}
|
2011-11-22 01:22:19 +04:00
|
|
|
if (aFor == eForTextPath) {
|
|
|
|
// For textPath, a transform on the referenced path affects the
|
|
|
|
// textPath layout, so when calculating the actual path length
|
|
|
|
// we need to take that into account.
|
2013-12-27 00:13:57 +04:00
|
|
|
gfxMatrix matrix = PrependLocalTransformsTo(gfxMatrix());
|
2013-11-18 05:29:06 +04:00
|
|
|
if (!matrix.IsIdentity()) {
|
2015-10-18 08:24:48 +03:00
|
|
|
RefPtr<PathBuilder> builder =
|
2013-12-27 00:13:57 +04:00
|
|
|
path->TransformedCopyToBuilder(ToMatrix(matrix));
|
2013-11-18 05:29:06 +04:00
|
|
|
path = builder->Finish();
|
|
|
|
}
|
2011-11-22 01:22:19 +04:00
|
|
|
}
|
2014-07-03 22:50:42 +04:00
|
|
|
return path->ComputeLength() / authorsPathLengthEstimate;
|
2011-05-01 22:26:20 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return 1.0;
|
|
|
|
}
|
2013-01-13 02:22:31 +04:00
|
|
|
|
2015-06-17 17:00:52 +03:00
|
|
|
already_AddRefed<Path>
|
2014-07-06 00:53:04 +04:00
|
|
|
SVGPathElement::BuildPath(PathBuilder* aBuilder)
|
2013-11-02 15:10:38 +04:00
|
|
|
{
|
|
|
|
// The Moz2D PathBuilder that our SVGPathData will be using only cares about
|
|
|
|
// the fill rule. However, in order to fulfill the requirements of the SVG
|
|
|
|
// spec regarding zero length sub-paths when square line caps are in use,
|
|
|
|
// SVGPathData needs to know our stroke-linecap style and, if "square", then
|
|
|
|
// also our stroke width. See the comment for
|
|
|
|
// ApproximateZeroLengthSubpathSquareCaps for more info.
|
|
|
|
|
|
|
|
uint8_t strokeLineCap = NS_STYLE_STROKE_LINECAP_BUTT;
|
|
|
|
Float strokeWidth = 0;
|
|
|
|
|
2015-10-18 08:24:48 +03:00
|
|
|
RefPtr<nsStyleContext> styleContext =
|
2013-11-02 15:10:38 +04:00
|
|
|
nsComputedDOMStyle::GetStyleContextForElementNoFlush(this, nullptr, nullptr);
|
|
|
|
if (styleContext) {
|
|
|
|
const nsStyleSVG* style = styleContext->StyleSVG();
|
|
|
|
// Note: the path that we return may be used for hit-testing, and SVG
|
|
|
|
// exposes hit-testing of strokes that are not actually painted. For that
|
|
|
|
// reason we do not check for eStyleSVGPaintType_None or check the stroke
|
|
|
|
// opacity here.
|
2014-10-03 12:50:42 +04:00
|
|
|
if (style->mStrokeLinecap != NS_STYLE_STROKE_LINECAP_BUTT) {
|
2013-11-02 15:10:38 +04:00
|
|
|
strokeLineCap = style->mStrokeLinecap;
|
2014-07-06 00:53:04 +04:00
|
|
|
strokeWidth = SVGContentUtils::GetStrokeWidth(this, styleContext, nullptr);
|
2013-11-02 15:10:38 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-10-04 15:13:30 +04:00
|
|
|
return mD.GetAnimValue().BuildPath(aBuilder, strokeLineCap, strokeWidth);
|
2013-11-02 15:10:38 +04:00
|
|
|
}
|
|
|
|
|
2013-01-13 02:22:31 +04:00
|
|
|
} // namespace dom
|
|
|
|
} // namespace mozilla
|