michael@0: /* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*- michael@0: * This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #ifndef MOZILLA_GFX_PATHD2D_H_ michael@0: #define MOZILLA_GFX_PATHD2D_H_ michael@0: michael@0: #include michael@0: michael@0: #include "2D.h" michael@0: michael@0: namespace mozilla { michael@0: namespace gfx { michael@0: michael@0: class PathD2D; michael@0: michael@0: class PathBuilderD2D : public PathBuilder michael@0: { michael@0: public: michael@0: MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(PathBuilderD2D) michael@0: PathBuilderD2D(ID2D1GeometrySink *aSink, ID2D1PathGeometry *aGeom, FillRule aFillRule) michael@0: : mSink(aSink) michael@0: , mGeometry(aGeom) michael@0: , mFigureActive(false) michael@0: , mFillRule(aFillRule) michael@0: { michael@0: } michael@0: virtual ~PathBuilderD2D(); michael@0: michael@0: virtual void MoveTo(const Point &aPoint); michael@0: virtual void LineTo(const Point &aPoint); michael@0: virtual void BezierTo(const Point &aCP1, michael@0: const Point &aCP2, michael@0: const Point &aCP3); michael@0: virtual void QuadraticBezierTo(const Point &aCP1, michael@0: const Point &aCP2); michael@0: virtual void Close(); michael@0: virtual void Arc(const Point &aOrigin, Float aRadius, Float aStartAngle, michael@0: Float aEndAngle, bool aAntiClockwise = false); michael@0: virtual Point CurrentPoint() const; michael@0: michael@0: virtual TemporaryRef Finish(); michael@0: michael@0: ID2D1GeometrySink *GetSink() { return mSink; } michael@0: michael@0: private: michael@0: friend class PathD2D; michael@0: michael@0: void EnsureActive(const Point &aPoint); michael@0: michael@0: RefPtr mSink; michael@0: RefPtr mGeometry; michael@0: michael@0: bool mFigureActive; michael@0: Point mCurrentPoint; michael@0: Point mBeginPoint; michael@0: FillRule mFillRule; michael@0: }; michael@0: michael@0: class PathD2D : public Path michael@0: { michael@0: public: michael@0: MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(PathD2D) michael@0: PathD2D(ID2D1PathGeometry *aGeometry, bool aEndedActive, michael@0: const Point &aEndPoint, FillRule aFillRule) michael@0: : mGeometry(aGeometry) michael@0: , mEndedActive(aEndedActive) michael@0: , mEndPoint(aEndPoint) michael@0: , mFillRule(aFillRule) michael@0: {} michael@0: michael@0: virtual BackendType GetBackendType() const { return BackendType::DIRECT2D; } michael@0: michael@0: virtual TemporaryRef CopyToBuilder(FillRule aFillRule = FillRule::FILL_WINDING) const; michael@0: virtual TemporaryRef TransformedCopyToBuilder(const Matrix &aTransform, michael@0: FillRule aFillRule = FillRule::FILL_WINDING) const; michael@0: michael@0: virtual bool ContainsPoint(const Point &aPoint, const Matrix &aTransform) const; michael@0: michael@0: virtual bool StrokeContainsPoint(const StrokeOptions &aStrokeOptions, michael@0: const Point &aPoint, michael@0: const Matrix &aTransform) const; michael@0: michael@0: virtual Rect GetBounds(const Matrix &aTransform = Matrix()) const; michael@0: michael@0: virtual Rect GetStrokedBounds(const StrokeOptions &aStrokeOptions, michael@0: const Matrix &aTransform = Matrix()) const; michael@0: michael@0: virtual void StreamToSink(PathSink *aSink) const; michael@0: michael@0: virtual FillRule GetFillRule() const { return mFillRule; } michael@0: michael@0: ID2D1Geometry *GetGeometry() { return mGeometry; } michael@0: michael@0: private: michael@0: friend class DrawTargetD2D; michael@0: friend class DrawTargetD2D1; michael@0: michael@0: mutable RefPtr mGeometry; michael@0: bool mEndedActive; michael@0: Point mEndPoint; michael@0: FillRule mFillRule; michael@0: }; michael@0: michael@0: } michael@0: } michael@0: michael@0: #endif /* MOZILLA_GFX_PATHD2D_H_ */