1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- /*
- * 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/SkPath.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/SkTDArray.h:382:26:
- // runtime error: signed integer overflow: 2147483644 + 4 cannot be represented in type 'int'
- static SK_UNUSED 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, SK_ARRAY_COUNT(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;
- SkPath 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, p);
- }
- #if 0
- #include "gm/gm.h"
- DEF_SIMPLE_GM(PathMeasure_explosion, canvas, 500,500) {
- path_measure_explosion(canvas);
- }
- #endif
|