PathCairo.h 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. /* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*-
  2. * This Source Code Form is subject to the terms of the Mozilla Public
  3. * License, v. 2.0. If a copy of the MPL was not distributed with this
  4. * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
  5. #ifndef MOZILLA_GFX_PATH_CAIRO_H_
  6. #define MOZILLA_GFX_PATH_CAIRO_H_
  7. #include "2D.h"
  8. #include "cairo.h"
  9. #include <vector>
  10. namespace mozilla {
  11. namespace gfx {
  12. class PathCairo;
  13. class PathBuilderCairo : public PathBuilder
  14. {
  15. public:
  16. MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(PathBuilderCairo)
  17. explicit PathBuilderCairo(FillRule aFillRule);
  18. virtual void MoveTo(const Point &aPoint);
  19. virtual void LineTo(const Point &aPoint);
  20. virtual void BezierTo(const Point &aCP1,
  21. const Point &aCP2,
  22. const Point &aCP3);
  23. virtual void QuadraticBezierTo(const Point &aCP1,
  24. const Point &aCP2);
  25. virtual void Close();
  26. virtual void Arc(const Point &aOrigin, float aRadius, float aStartAngle,
  27. float aEndAngle, bool aAntiClockwise = false);
  28. virtual Point CurrentPoint() const;
  29. virtual already_AddRefed<Path> Finish();
  30. virtual BackendType GetBackendType() const { return BackendType::CAIRO; }
  31. private: // data
  32. friend class PathCairo;
  33. FillRule mFillRule;
  34. std::vector<cairo_path_data_t> mPathData;
  35. // It's easiest to track this here, parsing the path data to find the current
  36. // point is a little tricky.
  37. Point mCurrentPoint;
  38. Point mBeginPoint;
  39. };
  40. class PathCairo : public Path
  41. {
  42. public:
  43. MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(PathCairo)
  44. PathCairo(FillRule aFillRule, std::vector<cairo_path_data_t> &aPathData, const Point &aCurrentPoint);
  45. explicit PathCairo(cairo_t *aContext);
  46. ~PathCairo();
  47. virtual BackendType GetBackendType() const { return BackendType::CAIRO; }
  48. virtual already_AddRefed<PathBuilder> CopyToBuilder(FillRule aFillRule) const;
  49. virtual already_AddRefed<PathBuilder> TransformedCopyToBuilder(const Matrix &aTransform,
  50. FillRule aFillRule) const;
  51. virtual bool ContainsPoint(const Point &aPoint, const Matrix &aTransform) const;
  52. virtual bool StrokeContainsPoint(const StrokeOptions &aStrokeOptions,
  53. const Point &aPoint,
  54. const Matrix &aTransform) const;
  55. virtual Rect GetBounds(const Matrix &aTransform = Matrix()) const;
  56. virtual Rect GetStrokedBounds(const StrokeOptions &aStrokeOptions,
  57. const Matrix &aTransform = Matrix()) const;
  58. virtual void StreamToSink(PathSink *aSink) const;
  59. virtual FillRule GetFillRule() const { return mFillRule; }
  60. void SetPathOnContext(cairo_t *aContext) const;
  61. void AppendPathToBuilder(PathBuilderCairo *aBuilder, const Matrix *aTransform = nullptr) const;
  62. private:
  63. void EnsureContainingContext(const Matrix &aTransform) const;
  64. FillRule mFillRule;
  65. std::vector<cairo_path_data_t> mPathData;
  66. mutable cairo_t *mContainingContext;
  67. mutable Matrix mContainingTransform;
  68. Point mCurrentPoint;
  69. };
  70. } // namespace gfx
  71. } // namespace mozilla
  72. #endif /* MOZILLA_GFX_PATH_CAIRO_H_ */