| /* | |
| * Copyright 2018 Google LLC | |
| * | |
| * Use of this source code is governed by a BSD-style license that can be | |
| * found in the LICENSE file. | |
| */ | |
| #include "include/core/SkCanvas.h" | |
| #include "include/core/SkPaint.h" | |
| #include "include/core/SkPathBuilder.h" | |
| #include "include/core/SkPathEffect.h" | |
| #include "include/core/SkTypes.h" | |
| #include "include/effects/SkDashPathEffect.h" | |
| #include <array> | |
| // Repro case for skbug.com/40038934. Requires lots of RAM to run, and currently triggers UB: | |
| // //include/private/SkTDArray.h:382:26: | |
| // runtime error: signed integer overflow: 2147483644 + 4 cannot be represented in type 'int' | |
| [[maybe_unused]] static void path_measure_explosion(SkCanvas* canvas) { | |
| SkPaint p; | |
| p.setAntiAlias(false); | |
| float intervals[] = { 0, 10e9f }; | |
| p.setStyle(SkPaint::kStroke_Style); | |
| p.setPathEffect(SkDashPathEffect::Make(intervals, 0)); | |
| static constexpr auto quadratic_at = std::to_array<int>({ | |
| 13, 68, 258, 1053, 1323, 2608, 10018, 15668, | |
| 59838, 557493, 696873, 871098, 4153813, 15845608, 48357008, 118059138, | |
| 288230353, 360287948, 562949933, 703687423, 1099511613, 0 | |
| }); | |
| int next_quadratic_at = 0; | |
| SkPathBuilder path; | |
| path.moveTo(0, 0); | |
| int i = 1; | |
| for (int points = 1; points < 2147483647; ) { | |
| if (points == quadratic_at[next_quadratic_at]) { | |
| path.quadTo(i, 0, i, 0); | |
| next_quadratic_at++; | |
| points += 2; | |
| } else { | |
| path.lineTo(i, 0); | |
| points += 1; | |
| } | |
| i++; | |
| if (i == 1000000) { | |
| path.moveTo(0, 0); | |
| points += 1; | |
| i = 1; | |
| } | |
| } | |
| canvas->drawPath(path.detach(), p); | |
| } | |
| #if 0 | |
| #include "gm/gm.h" | |
| DEF_SIMPLE_GM(PathMeasure_explosion, canvas, 500,500) { | |
| path_measure_explosion(canvas); | |
| } | |
| #endif |