Flutter Engine
The Flutter Engine
Functions | Variables
ParsePathTest.cpp File Reference
#include "include/core/SkPath.h"
#include "include/core/SkRect.h"
#include "include/core/SkScalar.h"
#include "include/core/SkString.h"
#include "include/utils/SkParsePath.h"
#include "tests/Test.h"
#include <array>
#include <cstddef>

Go to the source code of this file.

Functions

static void test_to_from (skiatest::Reporter *reporter, const SkPath &path)
 
 DEF_TEST (ParsePath, reporter)
 
static void testInvalidPath (skiatest::Reporter *reporter, const std::string &name, const std::string &input)
 
 DEF_TEST (ParsePath_InvalidDoesNotCrash, r)
 
 DEF_TEST (ParsePathOptionalCommand, r)
 
 DEF_TEST (ParsePathArcFlags, r)
 

Variables

struct {
   const char *   fStr
 
   const SkRect   fBounds
 
gRec []
 

Function Documentation

◆ DEF_TEST() [1/4]

DEF_TEST ( ParsePath  ,
reporter   
)

Definition at line 50 of file ParsePathTest.cpp.

50 {
51 for (size_t i = 0; i < std::size(gRec); i++) {
53 bool success = SkParsePath::FromSVGString(gRec[i].fStr, &path);
54 REPORTER_ASSERT(reporter, success);
55 const SkRect& expectedBounds = gRec[i].fBounds;
56 const SkRect& pathBounds = path.getBounds();
57 REPORTER_ASSERT(reporter, expectedBounds == pathBounds);
58
60 }
61
62 SkRect r;
63 r.setLTRB(0, 0, 10, 10.5f);
64 SkPath p;
65 p.addRect(r);
67 p.addOval(r);
69 p.addRoundRect(r, 4, 4.5f);
71}
reporter
Definition: FontMgrTest.cpp:39
static void test_to_from(skiatest::Reporter *reporter, const SkPath &path)
const char * fStr
static struct @435 gRec[]
#define REPORTER_ASSERT(r, cond,...)
Definition: Test.h:286
static bool FromSVGString(const char str[], SkPath *)
Definition: SkPath.h:59
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot The VM snapshot data that will be memory mapped as read only SnapshotAssetPath must be present isolate snapshot The isolate snapshot data that will be memory mapped as read only SnapshotAssetPath must be present cache dir path
Definition: switches.h:57
it will be possible to load the file into Perfetto s trace viewer disable asset Prevents usage of any non test fonts unless they were explicitly Loaded via prefetched default font Indicates whether the embedding started a prefetch of the default font manager before creating the engine run In non interactive keep the shell running after the Dart script has completed enable serial On low power devices with low core running concurrent GC tasks on threads can cause them to contend with the UI thread which could potentially lead to jank This option turns off all concurrent GC activities domain network JSON encoded network policy per domain This overrides the DisallowInsecureConnections switch Embedder can specify whether to allow or disallow insecure connections at a domain level old gen heap size
Definition: switches.h:259
void setLTRB(float left, float top, float right, float bottom)
Definition: SkRect.h:865

◆ DEF_TEST() [2/4]

DEF_TEST ( ParsePath_InvalidDoesNotCrash  ,
 
)

Definition at line 83 of file ParsePathTest.cpp.

83 {
84 testInvalidPath(r, "empty move", "M");
85 testInvalidPath(r, "partial move", "M 5");
86 testInvalidPath(r, "partial vertical line", "V"); // oss-fuzz:68723
87 testInvalidPath(r, "partial horizontal line", "H");
88 testInvalidPath(r, "partial cubic", "C 1 2");
89 testInvalidPath(r, "partial continued cubic", "S 6 7");
90 testInvalidPath(r, "partial quad", "Q 3 4 5");
91 testInvalidPath(r, "partial continued quad", "T");
92 testInvalidPath(r, "partial arc", "A 1 2 3 4 5 6");
93 testInvalidPath(r, "partial ~", "~ 7 6 5");
94}
static void testInvalidPath(skiatest::Reporter *reporter, const std::string &name, const std::string &input)

◆ DEF_TEST() [3/4]

DEF_TEST ( ParsePathArcFlags  ,
 
)

Definition at line 136 of file ParsePathTest.cpp.

136 {
137 const char* arcs = "M10 10a2.143 2.143 0 100-4.285 2.143 2.143 0 000 4.286";
138 SkPath path;
140 // Arcs decompose to two conics.
141 REPORTER_ASSERT(r, path.countVerbs() == 5);
142 // One for move, 2x per conic.
143 REPORTER_ASSERT(r, path.countPoints() == 9);
144}

◆ DEF_TEST() [4/4]

DEF_TEST ( ParsePathOptionalCommand  ,
 
)

Definition at line 96 of file ParsePathTest.cpp.

96 {
97 struct {
98 const char* fStr;
99 int fVerbs;
100 int fPoints;
101 } gTests[] = {
102 { "", 0, 0 },
103
104 { "H100 200 ", 3, 3 },
105 { "H-100-200", 3, 3 },
106 { "H+100+200", 3, 3 },
107 { "H.10.20" , 3, 3 },
108 { "H-.10-.20", 3, 3 },
109 { "H+.10+.20", 3, 3 },
110
111 { "L100 100 200 200" , 3, 3 },
112 { "L-100-100-200-200", 3, 3 },
113 { "L+100+100+200+200", 3, 3 },
114 { "L.10.10.20.20" , 3, 3 },
115 { "L-.10-.10-.20-.20", 3, 3 },
116 { "L+.10+.10+.20+.20", 3, 3 },
117
118 { "C100 100 200 200 300 300 400 400 500 500 600 600" , 3, 7 },
119 { "C100-100-200-200-300-300-400-400-500-500-600-600" , 3, 7 },
120 { "C100+100+200+200+300+300+400+400+500+500+600+600" , 3, 7 },
121 { "C.10.10.20.20.30.30.40.40.50.50.60.60" , 3, 7 },
122 { "C-.10-.10-.20-.20-.30-.30-.40-.40-.50-.50-.60-.60", 3, 7 },
123 { "C+.10+.10+.20+.20+.30+.30+.40+.40+.50+.50+.60+.60", 3, 7 },
124
125 { "c-1.49.71-2.12 2.5-1.4 4 .71 1.49 2.5 2.12 4 1.4z", 4, 7 },
126 };
127
128 SkPath path;
129 for (size_t i = 0; i < std::size(gTests); ++i) {
131 REPORTER_ASSERT(r, path.countVerbs() == gTests[i].fVerbs);
132 REPORTER_ASSERT(r, path.countPoints() == gTests[i].fPoints);
133 }
134}
static const TestCase gTests[]

◆ test_to_from()

static void test_to_from ( skiatest::Reporter reporter,
const SkPath path 
)
static

Definition at line 18 of file ParsePathTest.cpp.

18 {
20
22 bool success = SkParsePath::FromSVGString(str.c_str(), &path2);
23 REPORTER_ASSERT(reporter, success);
24
26 REPORTER_ASSERT(reporter, str == str2);
27#if 0 // closed paths are not equal, the iter explicitly gives the closing
28 // edge, even if it is not in the path.
30 if (path != path2) {
31 SkDebugf("str1=%s\nstr2=%s\n", str.c_str(), str2.c_str());
32 }
33#endif
34}
static SkPath path2()
void SK_SPI SkDebugf(const char format[],...) SK_PRINTF_LIKE(1
static SkString ToSVGString(const SkPath &, PathEncoding=PathEncoding::Absolute)
const char * c_str() const
Definition: SkString.h:133

◆ testInvalidPath()

static void testInvalidPath ( skiatest::Reporter reporter,
const std::string &  name,
const std::string &  input 
)
static

Definition at line 73 of file ParsePathTest.cpp.

74 {
77 bool success = SkParsePath::FromSVGString(input.c_str(), &path);
78 REPORTER_ASSERT(reporter, !success);
79 // We should not modify the input path on a failure.
80 REPORTER_ASSERT(reporter, path.isEmpty());
81}
DEF_SWITCHES_START aot vmservice shared library name
Definition: switches.h:32

Variable Documentation

◆ fBounds

const SkRect fBounds

Definition at line 38 of file ParsePathTest.cpp.

◆ fStr

const char* fStr

Definition at line 37 of file ParsePathTest.cpp.

◆ 

struct { ... } gRec[]
Initial value:
= {
{ "M1,1 l-2.58-2.828-3.82-0.113, 1.9-3.3223-1.08-3.6702, 3.75,0.7744,3.16-2.1551,"
"0.42,3.8008,3.02,2.3384-3.48,1.574-1.29,3.601z",
{ -5.39999962f, -10.3142f, 5.77000046f, 1.f } },
{ "", { 0, 0, 0, 0 } },
{ "M0,0L10,10", { 0, 0, SkIntToScalar(10), SkIntToScalar(10) } },
{ "M-5.5,-0.5 Q 0 0 6,6.50",
{ -5.5f, -0.5f,
6, 6.5f } }
}
#define SkIntToScalar(x)
Definition: SkScalar.h:57