LCOV - code coverage report
Current view: top level - gfx/2d - BezierUtils.h (source / functions) Hit Total Coverage
Test: output.info Lines: 0 1 0.0 %
Date: 2017-07-14 16:53:18 Functions: 0 1 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 2; 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             : 
       6             : #ifndef mozilla_BezierUtils_h_
       7             : #define mozilla_BezierUtils_h_
       8             : 
       9             : #include "mozilla/gfx/2D.h"
      10             : #include "gfxRect.h"
      11             : 
      12             : namespace mozilla {
      13             : namespace gfx {
      14             : 
      15             : // Control points for bezier curve
      16             : //
      17             : //                   mPoints[2]
      18             : //                    +-----___---+ mPoints[3]
      19             : //                      __--
      20             : //                   _--
      21             : //                  /
      22             : //                /
      23             : // mPoints[1] +  |
      24             : //            | |
      25             : //            ||
      26             : //            ||
      27             : //            |
      28             : //            |
      29             : //            |
      30             : //            |
      31             : // mPoints[0] +
      32           0 : struct Bezier {
      33             :   Point mPoints[4];
      34             : };
      35             : 
      36             : // Calculate a point or it's differential of a bezier curve formed by
      37             : // aBezier and parameter t.
      38             : //
      39             : //   GetBezierPoint = P(t)
      40             : //   GetBezierDifferential = P'(t)
      41             : //   GetBezierDifferential2 = P''(t)
      42             : //
      43             : //                   mPoints[2]
      44             : //                    +-----___---+ mPoints[3]
      45             : //                      __--     P(1)
      46             : //                   _--
      47             : //                  +
      48             : //                /  P(t)
      49             : // mPoints[1] +  |
      50             : //            | |
      51             : //            ||
      52             : //            ||
      53             : //            |
      54             : //            |
      55             : //            |
      56             : //            |
      57             : // mPoints[0] + P(0)
      58             : Point GetBezierPoint(const Bezier& aBezier, Float t);
      59             : Point GetBezierDifferential(const Bezier& aBezier, Float t);
      60             : Point GetBezierDifferential2(const Bezier& aBezier, Float t);
      61             : 
      62             : // Calculate length of a simple bezier curve formed by aBezier and range [a, b].
      63             : Float GetBezierLength(const Bezier& aBezier, Float a, Float b);
      64             : 
      65             : // Split bezier curve formed by aBezier into [0,t1], [t1,t2], [t2,1] parts, and
      66             : // stores control points for [t1,t2] to aSubBezier.
      67             : //
      68             : //                 ___---+
      69             : //             __+-     P(1)
      70             : //          _--   P(t2)
      71             : //         -
      72             : //       /  <-- aSubBezier
      73             : //      |
      74             : //     |
      75             : //    +
      76             : //    | P(t1)
      77             : //   |
      78             : //   |
      79             : //   |
      80             : //   |
      81             : //   + P(0)
      82             : void GetSubBezier(Bezier* aSubBezier, const Bezier& aBezier,
      83             :                   Float t1, Float t2);
      84             : 
      85             : // Find a nearest point on bezier curve formed by aBezier to a point aTarget.
      86             : // aInitialT is a hint to find the parameter t for the nearest point.
      87             : // If aT is non-null, parameter for the nearest point is stored to *aT.
      88             : // This function expects a bezier curve to be an approximation of elliptic arc.
      89             : // Otherwise it will return wrong point.
      90             : //
      91             : //  aTarget
      92             : //    +            ___---+
      93             : //             __--
      94             : //          _--
      95             : //         +
      96             : //       /  nearest point = P(t = *aT)
      97             : //      |
      98             : //     |
      99             : //    |
     100             : //    + P(aInitialT)
     101             : //   |
     102             : //   |
     103             : //   |
     104             : //   |
     105             : //   +
     106             : Point FindBezierNearestPoint(const Bezier& aBezier, const Point& aTarget,
     107             :                              Float aInitialT, Float* aT=nullptr);
     108             : 
     109             : // Calculate control points for a bezier curve that is an approximation of
     110             : // an elliptic arc.
     111             : //
     112             : //                                   aCornerSize.width
     113             : //                                 |<----------------->|
     114             : //                                 |                   |
     115             : //                     aCornerPoint|      mPoints[2]   |
     116             : //                    -------------+-------+-----___---+ mPoints[3]
     117             : //                    ^            |         __--
     118             : //                    |            |      _--
     119             : //                    |            |     -
     120             : //                    |            |   /
     121             : // aCornerSize.height | mPoints[1] +  |
     122             : //                    |            | |
     123             : //                    |            ||
     124             : //                    |            ||
     125             : //                    |            |
     126             : //                    |            |
     127             : //                    |            |
     128             : //                    v mPoints[0] |
     129             : //                    -------------+
     130             : void GetBezierPointsForCorner(Bezier* aBezier, mozilla::Corner aCorner,
     131             :                               const Point& aCornerPoint,
     132             :                               const Size& aCornerSize);
     133             : 
     134             : // Calculate the approximate length of a quarter elliptic arc formed by radii
     135             : // (a, b).
     136             : //
     137             : //                a
     138             : //      |<----------------->|
     139             : //      |                   |
     140             : //   ---+-------------___---+
     141             : //   ^  |         __--
     142             : //   |  |      _--
     143             : //   |  |     -
     144             : //   |  |   /
     145             : // b |  |  |
     146             : //   |  | |
     147             : //   |  ||
     148             : //   |  ||
     149             : //   |  |
     150             : //   |  |
     151             : //   |  |
     152             : //   v  |
     153             : //   ---+
     154             : Float GetQuarterEllipticArcLength(Float a, Float b);
     155             : 
     156             : // Calculate the distance between an elliptic arc formed by (origin, width,
     157             : // height), and a point P, along a line formed by |P + n * normal|.
     158             : // P should be outside of the ellipse, and the line should cross with the
     159             : // ellipse twice at n > 0 points.
     160             : //
     161             : //                            width
     162             : //                     |<----------------->|
     163             : //              origin |                   |
     164             : //          -----------+-------------___---+
     165             : //          ^  normal  |         __--
     166             : //          | P +->__  |      _--
     167             : //          |        --__    -
     168             : //          |          | --+
     169             : //   height |          |  |
     170             : //          |          | |
     171             : //          |          ||
     172             : //          |          ||
     173             : //          |          |
     174             : //          |          |
     175             : //          |          |
     176             : //          v          |
     177             : //          -----------+
     178             : Float CalculateDistanceToEllipticArc(const Point& P, const Point& normal,
     179             :                                      const Point& origin,
     180             :                                      Float width, Float height);
     181             : 
     182             : } // namespace gfx
     183             : } // namespace mozilla
     184             : 
     185             : #endif /* mozilla_BezierUtils_h_ */

Generated by: LCOV version 1.13