tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

SVGMotionSMILPathUtils.h (3689B)


      1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
      2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
      3 /* This Source Code Form is subject to the terms of the Mozilla Public
      4 * License, v. 2.0. If a copy of the MPL was not distributed with this
      5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      6 
      7 /* Helper class to help with generating anonymous path elements for
      8   <animateMotion> elements to use. */
      9 
     10 #ifndef DOM_SVG_SVGMOTIONSMILPATHUTILS_H_
     11 #define DOM_SVG_SVGMOTIONSMILPATHUTILS_H_
     12 
     13 #include "gfxPlatform.h"
     14 #include "mozilla/Attributes.h"
     15 #include "mozilla/RefPtr.h"
     16 #include "mozilla/SMILParserUtils.h"
     17 #include "mozilla/gfx/2D.h"
     18 #include "nsDebug.h"
     19 #include "nsStringFwd.h"
     20 #include "nsTArray.h"
     21 
     22 namespace mozilla {
     23 
     24 namespace dom {
     25 class SVGElement;
     26 }
     27 
     28 class SVGMotionSMILPathUtils {
     29  using DrawTarget = mozilla::gfx::DrawTarget;
     30  using Path = mozilla::gfx::Path;
     31  using PathBuilder = mozilla::gfx::PathBuilder;
     32 
     33 public:
     34  // Class to assist in generating a Path, based on
     35  // coordinates in the <animateMotion> from/by/to/values attributes.
     36  class PathGenerator {
     37   public:
     38    explicit PathGenerator(const dom::SVGElement* aSVGElement)
     39        : mSVGElement(aSVGElement), mHaveReceivedCommands(false) {
     40      RefPtr<DrawTarget> drawTarget =
     41          gfxPlatform::GetPlatform()->ScreenReferenceDrawTarget();
     42      NS_ASSERTION(
     43          gfxPlatform::GetPlatform()->SupportsAzureContentForDrawTarget(
     44              drawTarget),
     45          "Should support Moz2D content drawing");
     46 
     47      mPathBuilder = drawTarget->CreatePathBuilder();
     48    }
     49 
     50    // Methods for adding various path commands to output path.
     51    // Note: aCoordPairStr is expected to be a whitespace and/or
     52    // comma-separated x,y coordinate-pair -- see description of
     53    // "the specified values for from, by, to, and values" at
     54    //    http://www.w3.org/TR/SVG11/animate.html#AnimateMotionElement
     55    void MoveToOrigin();
     56    bool MoveToAbsolute(const nsAString& aCoordPairStr);
     57    bool LineToAbsolute(const nsAString& aCoordPairStr,
     58                        double& aSegmentDistance);
     59    bool LineToRelative(const nsAString& aCoordPairStr,
     60                        double& aSegmentDistance);
     61 
     62    // Accessor to let clients check if we've received any commands yet.
     63    inline bool HaveReceivedCommands() { return mHaveReceivedCommands; }
     64    // Accessor to get the finalized path
     65    already_AddRefed<Path> GetResultingPath();
     66 
     67   protected:
     68    // Helper methods
     69    bool ParseCoordinatePair(const nsAString& aCoordPairStr, float& aXVal,
     70                             float& aYVal);
     71 
     72    // Member data
     73    const dom::SVGElement* mSVGElement;  // context for converting to user units
     74    RefPtr<PathBuilder> mPathBuilder;
     75    bool mHaveReceivedCommands;
     76  };
     77 
     78  // Class to assist in passing each subcomponent of a |values| attribute to
     79  // a PathGenerator, for generating a corresponding Path.
     80  class MOZ_STACK_CLASS MotionValueParser
     81      : public SMILParserUtils::GenericValueParser {
     82   public:
     83    MotionValueParser(PathGenerator* aPathGenerator,
     84                      FallibleTArray<double>* aPointDistances)
     85        : mPathGenerator(aPathGenerator),
     86          mPointDistances(aPointDistances),
     87          mDistanceSoFar(0.0) {
     88      MOZ_ASSERT(mPointDistances->IsEmpty(),
     89                 "expecting point distances array to start empty");
     90    }
     91 
     92    // SMILParserUtils::GenericValueParser interface
     93    bool Parse(const nsAString& aValueStr) override;
     94 
     95   protected:
     96    PathGenerator* mPathGenerator;
     97    FallibleTArray<double>* mPointDistances;
     98    double mDistanceSoFar;
     99  };
    100 };
    101 
    102 }  // namespace mozilla
    103 
    104 #endif  // DOM_SVG_SVGMOTIONSMILPATHUTILS_H_