SkPointPriv.h 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. /*
  2. * Copyright 2006 The Android Open Source Project
  3. *
  4. * Use of this source code is governed by a BSD-style license that can be
  5. * found in the LICENSE file.
  6. */
  7. #ifndef SkPointPriv_DEFINED
  8. #define SkPointPriv_DEFINED
  9. #include "include/core/SkPoint.h"
  10. #include "include/core/SkRect.h"
  11. class SkPointPriv {
  12. public:
  13. enum Side {
  14. kLeft_Side = -1,
  15. kOn_Side = 0,
  16. kRight_Side = 1,
  17. };
  18. static bool AreFinite(const SkPoint array[], int count) {
  19. return SkScalarsAreFinite(&array[0].fX, count << 1);
  20. }
  21. static const SkScalar* AsScalars(const SkPoint& pt) { return &pt.fX; }
  22. static bool CanNormalize(SkScalar dx, SkScalar dy) {
  23. return SkScalarsAreFinite(dx, dy) && (dx || dy);
  24. }
  25. static SkScalar DistanceToLineBetweenSqd(const SkPoint& pt, const SkPoint& a,
  26. const SkPoint& b, Side* side = nullptr);
  27. static SkScalar DistanceToLineBetween(const SkPoint& pt, const SkPoint& a,
  28. const SkPoint& b, Side* side = nullptr) {
  29. return SkScalarSqrt(DistanceToLineBetweenSqd(pt, a, b, side));
  30. }
  31. static SkScalar DistanceToLineSegmentBetweenSqd(const SkPoint& pt, const SkPoint& a,
  32. const SkPoint& b);
  33. static SkScalar DistanceToLineSegmentBetween(const SkPoint& pt, const SkPoint& a,
  34. const SkPoint& b) {
  35. return SkScalarSqrt(DistanceToLineSegmentBetweenSqd(pt, a, b));
  36. }
  37. static SkScalar DistanceToSqd(const SkPoint& pt, const SkPoint& a) {
  38. SkScalar dx = pt.fX - a.fX;
  39. SkScalar dy = pt.fY - a.fY;
  40. return dx * dx + dy * dy;
  41. }
  42. static bool EqualsWithinTolerance(const SkPoint& p1, const SkPoint& p2) {
  43. return !CanNormalize(p1.fX - p2.fX, p1.fY - p2.fY);
  44. }
  45. static bool EqualsWithinTolerance(const SkPoint& pt, const SkPoint& p, SkScalar tol) {
  46. return SkScalarNearlyZero(pt.fX - p.fX, tol)
  47. && SkScalarNearlyZero(pt.fY - p.fY, tol);
  48. }
  49. static SkScalar LengthSqd(const SkPoint& pt) {
  50. return SkPoint::DotProduct(pt, pt);
  51. }
  52. static void Negate(SkIPoint& pt) {
  53. pt.fX = -pt.fX;
  54. pt.fY = -pt.fY;
  55. }
  56. static void RotateCCW(const SkPoint& src, SkPoint* dst) {
  57. // use a tmp in case src == dst
  58. SkScalar tmp = src.fX;
  59. dst->fX = src.fY;
  60. dst->fY = -tmp;
  61. }
  62. static void RotateCCW(SkPoint* pt) {
  63. RotateCCW(*pt, pt);
  64. }
  65. static void RotateCW(const SkPoint& src, SkPoint* dst) {
  66. // use a tmp in case src == dst
  67. SkScalar tmp = src.fX;
  68. dst->fX = -src.fY;
  69. dst->fY = tmp;
  70. }
  71. static void RotateCW(SkPoint* pt) {
  72. RotateCW(*pt, pt);
  73. }
  74. static bool SetLengthFast(SkPoint* pt, float length);
  75. static SkPoint MakeOrthog(const SkPoint& vec, Side side = kLeft_Side) {
  76. SkASSERT(side == kRight_Side || side == kLeft_Side);
  77. return (side == kRight_Side) ? SkPoint{-vec.fY, vec.fX} : SkPoint{vec.fY, -vec.fX};
  78. }
  79. // counter-clockwise fan
  80. static void SetRectFan(SkPoint v[], SkScalar l, SkScalar t, SkScalar r, SkScalar b,
  81. size_t stride) {
  82. SkASSERT(stride >= sizeof(SkPoint));
  83. ((SkPoint*)((intptr_t)v + 0 * stride))->set(l, t);
  84. ((SkPoint*)((intptr_t)v + 1 * stride))->set(l, b);
  85. ((SkPoint*)((intptr_t)v + 2 * stride))->set(r, b);
  86. ((SkPoint*)((intptr_t)v + 3 * stride))->set(r, t);
  87. }
  88. // tri strip with two counter-clockwise triangles
  89. static void SetRectTriStrip(SkPoint v[], SkScalar l, SkScalar t, SkScalar r, SkScalar b,
  90. size_t stride) {
  91. SkASSERT(stride >= sizeof(SkPoint));
  92. ((SkPoint*)((intptr_t)v + 0 * stride))->set(l, t);
  93. ((SkPoint*)((intptr_t)v + 1 * stride))->set(l, b);
  94. ((SkPoint*)((intptr_t)v + 2 * stride))->set(r, t);
  95. ((SkPoint*)((intptr_t)v + 3 * stride))->set(r, b);
  96. }
  97. static void SetRectTriStrip(SkPoint v[], const SkRect& rect, size_t stride) {
  98. SetRectTriStrip(v, rect.fLeft, rect.fTop, rect.fRight, rect.fBottom, stride);
  99. }
  100. };
  101. #endif