Flutter Engine
The Flutter Engine
ClipCubicTest.cpp
Go to the documentation of this file.
1/*
2 * Copyright 2011 Google Inc.
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
13#include "include/core/SkPath.h"
15#include "include/core/SkRect.h"
23#include "tests/Test.h"
24
25// Currently the supersampler blitter uses int16_t for its index into an array
26// the width of the clip. Test that we don't crash/assert if we try to draw
27// with a device/clip that is larger.
28static void test_giantClip() {
29 SkBitmap bm;
30 bm.allocN32Pixels(64919, 1);
31 SkCanvas canvas(bm);
33
35 paint.setAntiAlias(true);
36 canvas.drawPath(SkPath::Polygon({{0,0}, {1,0}, {33,1}}, false), paint);
37}
38
39static void PrintCurve(const char *name, const SkPoint crv[4]) {
40 SkDebugf("%s: %.10g, %.10g, %.10g, %.10g, %.10g, %.10g, %.10g, %.10g\n",
41 name,
42 (float)crv[0].fX, (float)crv[0].fY,
43 (float)crv[1].fX, (float)crv[1].fY,
44 (float)crv[2].fX, (float)crv[2].fY,
45 (float)crv[3].fX, (float)crv[3].fY);
46
47}
48
49
50static bool CurvesAreEqual(const SkPoint c0[4],
51 const SkPoint c1[4],
52 float tol) {
53 for (int i = 0; i < 4; i++) {
54 if (SkScalarAbs(c0[i].fX - c1[i].fX) > tol ||
55 SkScalarAbs(c0[i].fY - c1[i].fY) > tol
56 ) {
57 PrintCurve("c0", c0);
58 PrintCurve("c1", c1);
59 return false;
60 }
61 }
62 return true;
63}
64
65
66static SkPoint* SetCurve(float x0, float y0,
67 float x1, float y1,
68 float x2, float y2,
69 float x3, float y3,
70 SkPoint crv[4]) {
71 crv[0].fX = x0; crv[0].fY = y0;
72 crv[1].fX = x1; crv[1].fY = y1;
73 crv[2].fX = x2; crv[2].fY = y2;
74 crv[3].fX = x3; crv[3].fY = y3;
75 return crv;
76}
77
78
79DEF_TEST(ClipCubic, reporter) {
80 static SkPoint crv[4] = {
83 { SkIntToScalar(1), SkIntToScalar(10) },
85 };
86
87 SkCubicClipper clipper;
88 SkPoint clipped[4], shouldbe[4];
90 bool success;
91 const float tol = 1e-4f;
92
93 // Test no clip, with plenty of room.
94 clipRect.setLTRB(-2, -2, 6, 14);
95 clipper.setClip(clipRect);
96 success = clipper.clipCubic(crv, clipped);
97 REPORTER_ASSERT(reporter, success == true);
99 0, 0, 2, 3, 1, 10, 4, 12, shouldbe), tol));
100
101 // Test no clip, touching first point.
102 clipRect.setLTRB(-2, 0, 6, 14);
103 clipper.setClip(clipRect);
104 success = clipper.clipCubic(crv, clipped);
105 REPORTER_ASSERT(reporter, success == true);
107 0, 0, 2, 3, 1, 10, 4, 12, shouldbe), tol));
108
109 // Test no clip, touching last point.
110 clipRect.setLTRB(-2, -2, 6, 12);
111 clipper.setClip(clipRect);
112 success = clipper.clipCubic(crv, clipped);
113 REPORTER_ASSERT(reporter, success == true);
115 0, 0, 2, 3, 1, 10, 4, 12, shouldbe), tol));
116
117 // Test all clip.
118 clipRect.setLTRB(-2, 14, 6, 20);
119 clipper.setClip(clipRect);
120 success = clipper.clipCubic(crv, clipped);
121 REPORTER_ASSERT(reporter, success == false);
122
123 // Test clip at 1.
124 clipRect.setLTRB(-2, 1, 6, 14);
125 clipper.setClip(clipRect);
126 success = clipper.clipCubic(crv, clipped);
127 REPORTER_ASSERT(reporter, success == true);
129 0.5126125216f, 1,
130 1.841195941f, 4.337081432f,
131 1.297019958f, 10.19801331f,
132 4, 12,
133 shouldbe), tol));
134
135 // Test clip at 2.
136 clipRect.setLTRB(-2, 2, 6, 14);
137 clipper.setClip(clipRect);
138 success = clipper.clipCubic(crv, clipped);
139 REPORTER_ASSERT(reporter, success == true);
141 00.8412352204f, 2,
142 1.767683744f, 5.400758266f,
143 1.55052948f, 10.36701965f,
144 4, 12,
145 shouldbe), tol));
146
147 // Test clip at 11.
148 clipRect.setLTRB(-2, -2, 6, 11);
149 clipper.setClip(clipRect);
150 success = clipper.clipCubic(crv, clipped);
151 REPORTER_ASSERT(reporter, success == true);
153 0, 0,
154 1.742904663f, 2.614356995f,
155 1.207521796f, 8.266430855f,
156 3.026495695f, 11,
157 shouldbe), tol));
158
159 // Test clip at 10.
160 clipRect.setLTRB(-2, -2, 6, 10);
161 clipper.setClip(clipRect);
162 success = clipper.clipCubic(crv, clipped);
163 REPORTER_ASSERT(reporter, success == true);
165 0, 0,
166 1.551193237f, 2.326789856f,
167 1.297736168f, 7.059780121f,
168 2.505550385f, 10,
169 shouldbe), tol));
170
172}
173
174DEF_TEST(test_fuzz_crbug_698714, reporter) {
176 SkCanvas* canvas = surface->getCanvas();
178 paint.setAntiAlias(true);
179 SkPath path;
180 path.moveTo(SkBits2Float(0x00000000), SkBits2Float(0x00000000)); // 0,0
181 path.lineTo(SkBits2Float(0x43434343), SkBits2Float(0x43430143)); //195.263f, 195.005f
182 path.lineTo(SkBits2Float(0x43434343), SkBits2Float(0x43434343)); //195.263f, 195.263f
183 path.lineTo(SkBits2Float(0xb5434343), SkBits2Float(0x434300be)); //-7.2741e-07f, 195.003f
184 // 195.263f, 195.263f, -1.16387e-05f, 3.58641e-38f, 3.85088e-29f,1.86082e-39f
185 path.cubicTo(SkBits2Float(0x43434343), SkBits2Float(0x43434341),
186 SkBits2Float(0xb74343bd), SkBits2Float(0x01434343),
187 SkBits2Float(0x10434343), SkBits2Float(0x00144332));
188 // 4.11823e-38f, 195.263f, 195.263f, 195.263f, -7.2741e-07f, 195.263f
189 path.cubicTo(SkBits2Float(0x016037c0), SkBits2Float(0x43434343),
190 SkBits2Float(0x43434343), SkBits2Float(0x43434343),
191 SkBits2Float(0xb5434343), SkBits2Float(0x43434343));
192 // 195.263f, 195.263f, -1.16387e-05f, 3.58641e-38f, 195.263f, -2
193 path.cubicTo(SkBits2Float(0x43434344), SkBits2Float(0x43434341),
194 SkBits2Float(0xb74343bd), SkBits2Float(0x01434343),
195 SkBits2Float(0x43434343), SkBits2Float(0xc0000014));
196 // -5.87228e+06f, 3.7773e-07f, 3.60231e-13f, -6.64511e+06f,2.77692e-15f, 2.48803e-15f
197 path.cubicTo(SkBits2Float(0xcab33535), SkBits2Float(0x34cacaca),
198 SkBits2Float(0x2acacaca), SkBits2Float(0xcacacae3),
199 SkBits2Float(0x27481927), SkBits2Float(0x27334805));
200 path.lineTo(SkBits2Float(0xb5434343), SkBits2Float(0x43434343)); //-7.2741e-07f, 195.263f
201 // 195.263f, 195.263f, -1.16387e-05f, 195.212f, 195.263f, -2
202 path.cubicTo(SkBits2Float(0x43434343), SkBits2Float(0x43434341),
203 SkBits2Float(0xb74343b9), SkBits2Float(0x43433643),
204 SkBits2Float(0x43434343), SkBits2Float(0xc0000014));
205 path.lineTo(SkBits2Float(0xc7004343), SkBits2Float(0x27480527)); //-32835.3f, 2.77584e-15f
206 path.lineTo(SkBits2Float(0x00000000), SkBits2Float(0x00000000)); // 0,0
207 path.close();
208 canvas->clipRect({0, 0, 65, 202});
209 canvas->drawPath(path, paint);
210}
211
212DEF_TEST(cubic_scan_error_crbug_844457_and_845489, reporter) {
214 SkCanvas* canvas = surface->getCanvas();
215 SkPaint p;
216
217 SkPath path;
218 path.moveTo(-30/64.0, -31/64.0);
219 path.cubicTo(-31/64.0, -31/64,-31/64.0, -31/64,-31/64.0, 100);
220 path.lineTo(100, 100);
221 canvas->drawPath(path, p);
222
223 // May need to define SK_RASTERIZE_EVEN_ROUNDING to trigger the need for this test
224 path.reset();
225 path.moveTo(-30/64.0f, -31/64.0f + 1/256.0f);
226 path.cubicTo(-31/64.0f + 1/256.0f, -31/64.0f + 1/256.0f,
227 -31/64.0f + 1/256.0f, -31/64.0f + 1/256.0f,
228 -31/64.0f + 1/256.0f, 100);
229 path.lineTo(100, 100);
230 canvas->drawPath(path, p);
231}
static bool CurvesAreEqual(const SkPoint c0[4], const SkPoint c1[4], float tol)
static SkPoint * SetCurve(float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3, SkPoint crv[4])
DEF_TEST(ClipCubic, reporter)
static void PrintCurve(const char *name, const SkPoint crv[4])
static void test_giantClip()
reporter
Definition: FontMgrTest.cpp:39
constexpr SkColor SK_ColorTRANSPARENT
Definition: SkColor.h:99
void SK_SPI SkDebugf(const char format[],...) SK_PRINTF_LIKE(1
static float SkBits2Float(uint32_t bits)
Definition: SkFloatBits.h:48
#define SkIntToScalar(x)
Definition: SkScalar.h:57
#define SkScalarAbs(x)
Definition: SkScalar.h:39
#define REPORTER_ASSERT(r, cond,...)
Definition: Test.h:286
void allocN32Pixels(int width, int height, bool isOpaque=false)
Definition: SkBitmap.cpp:232
void clipRect(const SkRect &rect, SkClipOp op, bool doAntiAlias)
Definition: SkCanvas.cpp:1361
void clear(SkColor color)
Definition: SkCanvas.h:1199
void drawPath(const SkPath &path, const SkPaint &paint)
Definition: SkCanvas.cpp:1747
bool clipCubic(const SkPoint src[4], SkPoint dst[4])
void setClip(const SkIRect &clip)
Definition: SkPath.h:59
static SkPath Polygon(const SkPoint pts[], int count, bool isClosed, SkPathFillType=SkPathFillType::kWinding, bool isVolatile=false)
Definition: SkPath.cpp:3614
const Paint & paint
Definition: color_source.cc:38
VkSurfaceKHR surface
Definition: main.cc:49
clipRect(r.rect, r.opAA.op(), r.opAA.aa())) template<> void Draw
SK_API sk_sp< SkSurface > Raster(const SkImageInfo &imageInfo, size_t rowBytes, const SkSurfaceProps *surfaceProps)
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
DEF_SWITCHES_START aot vmservice shared library name
Definition: switches.h:32
Definition: SkRect.h:32
static SkImageInfo MakeN32Premul(int width, int height)
float fX
x-axis value
Definition: SkPoint_impl.h:164
float fY
y-axis value
Definition: SkPoint_impl.h:165