/*
 * 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
