Issue #2483 - Support DOMMatrix2DInit for addPath

This commit is contained in:
Daniel Jacobs 2024-03-18 16:43:23 -04:00 • committed by roytam1
commit 39f5c51c10
3 changed files with 22 additions and 12 deletions

View file

@ -16,7 +16,7 @@ namespace mozilla {
namespace dom { namespace dom {
enum class CanvasWindingRule : uint32_t; enum class CanvasWindingRule : uint32_t;
class SVGMatrix; struct DOMMatrix2DInit;
class CanvasPath final : class CanvasPath final :
public nsWrapperCache public nsWrapperCache
@ -69,8 +69,8 @@ public:
CanvasPath(nsISupports* aParent, CanvasPath(nsISupports* aParent,
already_AddRefed<gfx::PathBuilder> aPathBuilder); already_AddRefed<gfx::PathBuilder> aPathBuilder);
void AddPath(CanvasPath& aCanvasPath, void AddPath(CanvasPath& aCanvasPath, const DOMMatrix2DInit& aInit,
const Optional<NonNull<SVGMatrix>>& aMatrix); ErrorResult& aError);
private: private:
virtual ~CanvasPath() {} virtual ~CanvasPath() {}

View file

@ -80,6 +80,7 @@
#include "mozilla/CheckedInt.h" #include "mozilla/CheckedInt.h"
#include "mozilla/DebugOnly.h" #include "mozilla/DebugOnly.h"
#include "mozilla/dom/ContentParent.h" #include "mozilla/dom/ContentParent.h"
#include "mozilla/dom/DOMMatrix.h"
#include "mozilla/dom/ImageBitmap.h" #include "mozilla/dom/ImageBitmap.h"
#include "mozilla/dom/ImageData.h" #include "mozilla/dom/ImageData.h"
#include "mozilla/dom/PBrowserParent.h" #include "mozilla/dom/PBrowserParent.h"
@ -6579,19 +6580,28 @@ CanvasPath::BezierTo(const gfx::Point& aCP1,
} }
void void
CanvasPath::AddPath(CanvasPath& aCanvasPath, const Optional<NonNull<SVGMatrix>>& aMatrix) CanvasPath::AddPath(CanvasPath& aCanvasPath, const DOMMatrix2DInit& aInit,
ErrorResult& aError)
{ {
RefPtr<gfx::Path> tempPath = aCanvasPath.GetPath(CanvasWindingRule::Nonzero, RefPtr<gfx::Path> tempPath = aCanvasPath.GetPath(CanvasWindingRule::Nonzero,
gfxPlatform::GetPlatform()->ScreenReferenceDrawTarget()); gfxPlatform::GetPlatform()->ScreenReferenceDrawTarget());
if (aMatrix.WasPassed()) { RefPtr<DOMMatrixReadOnly> matrix =
const SVGMatrix& m = aMatrix.Value(); DOMMatrixReadOnly::FromMatrix(GetParentObject(), aInit, aError);
Matrix transform(m.A(), m.B(), m.C(), m.D(), m.E(), m.F()); if (aError.Failed()) {
return;
}
if (!transform.IsIdentity()) { Matrix transform(*(matrix->GetInternal2D()));
RefPtr<PathBuilder> tempBuilder = tempPath->TransformedCopyToBuilder(transform, FillRule::FILL_WINDING);
tempPath = tempBuilder->Finish(); if (!transform.IsFinite()) {
} return;
}
if (!transform.IsIdentity()) {
RefPtr<PathBuilder> tempBuilder = tempPath->TransformedCopyToBuilder(transform, FillRule::FILL_WINDING);
tempPath = tempBuilder->Finish();
} }
EnsurePathBuilder(); // in case a path is added to itself EnsurePathBuilder(); // in case a path is added to itself

View file

@ -335,6 +335,6 @@ interface TextMetrics {
Constructor(DOMString pathString)] Constructor(DOMString pathString)]
interface Path2D interface Path2D
{ {
void addPath(Path2D path, optional SVGMatrix transformation); [Throws] void addPath(Path2D path, optional DOMMatrix2DInit transformation);
}; };
Path2D implements CanvasPathMethods; Path2D implements CanvasPathMethods;