| /* | 
 |  * Copyright 2018 Google Inc. | 
 |  * | 
 |  * 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" | 
 |  | 
 | // Repro case for skia:7674.  Requires lots of RAM to run, and currently triggers UB: | 
 | // //include/private/base/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, std::size(intervals), 0)); | 
 |  | 
 |     int quadratic_at[] = { | 
 |         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 |