/*
 * 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 "gm/gm.h"
#include "include/core/SkBitmap.h"
#include "include/core/SkPaint.h"
#include "include/core/SkPath.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'

#if 0
DEF_SIMPLE_GM(PathMeasure_explosion, canvas, 500,500) {
    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);
}
#endif
