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

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, 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
