/*
 * Copyright 2011 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/SkCanvas.h"
#include "include/core/SkColor.h"
#include "include/core/SkFont.h"
#include "include/core/SkFontStyle.h"
#include "include/core/SkPaint.h"
#include "include/core/SkPath.h"
#include "include/core/SkRect.h"
#include "include/core/SkScalar.h"
#include "include/core/SkString.h"
#include "include/core/SkTypeface.h"
#include "include/core/SkTypes.h"
#include "src/core/SkPathPriv.h"
#include "src/core/SkTextFormatParams.h"
#include "tools/ToolUtils.h"

/* Generated on a Mac with:
 * paint.setTypeface(SkTypeface::CreateByName("Papyrus"));
 * paint.getTextPath("H", 1, 100, 80, &textPath);
 */
static SkPath papyrus_hello() {
    SkPath path;
    path.moveTo(169.824f, 83.4102f);
    path.lineTo(167.285f, 85.6074f);
    path.lineTo(166.504f, 87.2188f);
    path.lineTo(165.82f, 86.7793f);
    path.lineTo(165.186f, 87.1211f);
    path.lineTo(164.6f, 88.1953f);
    path.lineTo(161.914f, 89.416f);
    path.lineTo(161.719f, 89.2207f);
    path.lineTo(160.596f, 88.8789f);
    path.lineTo(160.498f, 87.6094f);
    path.lineTo(160.693f, 86.3887f);
    path.lineTo(161.621f, 84.6797f);
    path.lineTo(161.279f, 83.2148f);
    path.lineTo(161.523f, 81.9941f);
    path.lineTo(162.012f, 79.1133f);
    path.lineTo(162.695f, 76.623f);
    path.lineTo(162.305f, 73.4004f);
    path.lineTo(162.207f, 72.4238f);
    path.lineTo(163.477f, 71.4961f);
    path.quadTo(163.525f, 71.0078f, 163.525f, 70.2754f);
    path.quadTo(163.525f, 68.8594f, 162.793f, 67.1992f);
    path.lineTo(163.623f, 64.6113f);
    path.lineTo(162.598f, 63.6836f);
    path.lineTo(163.184f, 61.0957f);
    path.lineTo(162.695f, 60.8027f);
    path.lineTo(162.988f, 52.5996f);
    path.lineTo(162.402f, 52.1113f);
    path.lineTo(161.914f, 50.1094f);
    path.lineTo(161.523f, 50.5f);
    path.quadTo(160.645f, 50.5f, 160.327f, 50.6465f);
    path.quadTo(160.01f, 50.793f, 159.424f, 51.4766f);
    path.lineTo(158.203f, 52.7949f);
    path.lineTo(156.299f, 52.0137f);
    path.quadTo(154.346f, 52.5996f, 154.004f, 52.5996f);
    path.quadTo(154.053f, 52.5996f, 152.783f, 52.4043f);
    path.quadTo(151.465f, 51.3789f, 150.488f, 51.3789f);
    path.quadTo(150.342f, 51.3789f, 150.269f, 51.4033f);
    path.quadTo(150.195f, 51.4277f, 150.098f, 51.4766f);
    path.lineTo(145.02f, 51.916f);
    path.lineTo(139.893f, 51.2812f);
    path.lineTo(135.693f, 51.623f);
    path.lineTo(133.594f, 51.0859f);
    path.lineTo(130.42f, 52.0137f);
    path.lineTo(125.488f, 51.4766f);
    path.lineTo(124.219f, 51.623f);
    path.lineTo(122.705f, 50.5f);
    path.lineTo(122.217f, 51.7207f);
    path.lineTo(116.211f, 51.623f);
    path.quadTo(114.99f, 52.7949f, 114.99f, 53.8203f);
    path.lineTo(115.576f, 57.6777f);
    path.quadTo(115.723f, 58.2148f, 115.723f, 59.2891f);
    path.quadTo(115.723f, 60.2656f, 115.186f, 61.1934f);
    path.lineTo(115.479f, 64.2207f);
    path.quadTo(114.795f, 64.6602f, 114.648f, 65.0752f);
    path.quadTo(114.502f, 65.4902f, 114.502f, 66.3203f);
    path.quadTo(114.893f, 66.9551f, 115.918f, 67.1992f);
    path.lineTo(116.016f, 69.2988f);
    path.lineTo(116.016f, 75.6953f);
    path.lineTo(116.016f, 75.9883f);
    path.lineTo(116.113f, 77.209f);
    path.quadTo(116.113f, 77.6484f, 115.479f, 78.0879f);
    path.lineTo(115.576f, 79.1133f);
    path.lineTo(116.309f, 82.0918f);
    path.lineTo(116.406f, 83.1172f);
    path.quadTo(116.406f, 85.2656f, 114.404f, 86.291f);
    path.lineTo(111.914f, 87.5117f);
    path.lineTo(109.717f, 88.7812f);
    path.lineTo(108.398f, 89.416f);
    path.lineTo(108.105f, 88.9766f);
    path.lineTo(107.617f, 88.9766f);
    path.quadTo(107.08f, 87.9023f, 107.08f, 87.0234f);
    path.quadTo(107.08f, 85.998f, 107.324f, 85.6074f);
    path.lineTo(108.398f, 83.1172f);
    path.lineTo(108.887f, 81.4082f);
    path.lineTo(109.619f, 81.1152f);
    path.lineTo(109.717f, 79.5039f);
    path.lineTo(108.887f, 78.7227f);
    path.quadTo(109.619f, 77.3555f, 109.619f, 77.1113f);
    path.quadTo(109.619f, 76.8672f, 108.887f, 75.5977f);
    path.lineTo(108.789f, 74.7188f);
    path.lineTo(109.18f, 66.6133f);
    path.lineTo(108.691f, 64.416f);
    path.quadTo(108.691f, 63.293f, 109.521f, 62.707f);
    path.lineTo(110.205f, 62.1211f);
    path.quadTo(110.449f, 61.877f, 110.596f, 60.998f);
    path.quadTo(109.082f, 60.4609f, 109.082f, 59.1914f);
    path.lineTo(109.082f, 58.9961f);
    path.lineTo(109.424f, 55.2852f);
    path.lineTo(108.789f, 53.7227f);
    path.lineTo(108.789f, 48.1074f);
    path.lineTo(108.594f, 45.3242f);
    path.lineTo(108.691f, 43.8105f);
    path.lineTo(107.91f, 43.9082f);
    path.lineTo(107.715f, 44.1035f);
    path.lineTo(107.324f, 42.7852f);
    path.lineTo(107.715f, 43.1758f);
    path.lineTo(107.91f, 41.3203f);
    path.quadTo(109.717f, 40.2949f, 109.717f, 39.2207f);
    path.quadTo(109.717f, 37.707f, 107.715f, 37.4141f);
    path.lineTo(106.982f, 33.9961f);
    path.lineTo(106.982f, 33.2148f);
    path.lineTo(106.689f, 29.3086f);
    path.lineTo(106.689f, 26.1836f);
    path.lineTo(107.91f, 25.6953f);
    path.lineTo(109.521f, 24.5234f);
    path.lineTo(112.109f, 23.3027f);
    path.lineTo(114.014f, 22.5215f);
    path.lineTo(115.479f, 23.1074f);
    path.quadTo(115.479f, 24.0352f, 116.113f, 25.1094f);
    path.quadTo(115.381f, 25.8906f, 115.259f, 26.3789f);
    path.quadTo(115.137f, 26.8672f, 114.99f, 28.8203f);
    path.lineTo(114.893f, 29.9922f);
    path.lineTo(115.82f, 33.4102f);
    path.lineTo(116.016f, 35.4121f);
    path.lineTo(115.576f, 35.4121f);
    path.lineTo(114.697f, 37.707f);
    path.lineTo(115.381f, 38.4883f);
    path.lineTo(115.186f, 39.5137f);
    path.lineTo(114.697f, 40.3926f);
    path.lineTo(114.209f, 41.418f);
    path.lineTo(114.404f, 42.4922f);
    path.lineTo(114.795f, 43.3223f);
    path.quadTo(115.186f, 44.1035f, 115.186f, 46.4961f);
    path.lineTo(116.309f, 46.7891f);
    path.lineTo(125, 47.2773f);
    path.lineTo(126.318f, 48.2051f);
    path.lineTo(129.59f, 48.5957f);
    path.lineTo(130.615f, 48.498f);
    path.lineTo(130.908f, 48.0098f);
    path.lineTo(134.277f, 48.2051f);
    path.lineTo(134.717f, 48.3027f);
    path.quadTo(135.4f, 47.7168f, 136.084f, 47.7168f);
    path.lineTo(137.109f, 47.8145f);
    path.lineTo(137.109f, 48.2051f);
    path.lineTo(137.695f, 48.5957f);
    path.lineTo(138.818f, 48.498f);
    path.lineTo(144.189f, 48.4004f);
    path.lineTo(146.191f, 48.2051f);
    path.lineTo(147.998f, 48.791f);
    path.quadTo(148.877f, 47.5215f, 150.098f, 47.5215f);
    path.lineTo(150.293f, 47.5215f);
    path.lineTo(152.783f, 47.7168f);
    path.lineTo(157.52f, 47.2773f);
    path.lineTo(160.303f, 47.4238f);
    path.lineTo(161.279f, 47.1797f);
    path.lineTo(161.621f, 46.1055f);
    path.lineTo(162.5f, 43.9082f);
    path.lineTo(162.305f, 38.293f);
    path.lineTo(162.5f, 37.1211f);
    path.lineTo(161.816f, 35.998f);
    path.lineTo(160.596f, 34.7773f);
    path.lineTo(160.596f, 32.6777f);
    path.lineTo(160.303f, 30.4805f);
    path.lineTo(160.889f, 29.4062f);
    path.quadTo(160.303f, 27.4043f, 160.303f, 26.2812f);
    path.quadTo(160.303f, 25.3535f, 160.889f, 25.207f);
    path.lineTo(162.207f, 25.0117f);
    path.lineTo(163.721f, 23.8887f);
    path.lineTo(164.893f, 23.8887f);
    path.quadTo(165.625f, 23.6934f, 166.797f, 22.5215f);
    path.lineTo(168.213f, 23.2051f);
    path.lineTo(168.701f, 25.5f);
    path.lineTo(169.092f, 26.8184f);
    path.lineTo(167.676f, 31.9941f);
    path.lineTo(168.018f, 34.6797f);
    path.lineTo(167.822f, 35.8027f);
    path.lineTo(167.285f, 35.8027f);
    path.quadTo(166.602f, 35.8027f, 166.602f, 36.7793f);
    path.quadTo(166.846f, 37.3652f, 167.578f, 37.707f);
    path.lineTo(168.506f, 38.1953f);
    path.lineTo(168.799f, 39.5137f);
    path.lineTo(169.092f, 41.5156f);
    path.lineTo(168.994f, 42.1016f);
    path.lineTo(168.213f, 43.6152f);
    path.lineTo(168.408f, 52.502f);
    path.lineTo(168.213f, 60.1191f);
    path.lineTo(168.994f, 61.291f);
    path.quadTo(168.604f, 63.0488f, 168.604f, 63.9766f);
    path.lineTo(168.604f, 64.123f);
    path.lineTo(168.604f, 64.3184f);
    path.lineTo(168.604f, 64.9043f);
    path.lineTo(168.604f, 66.0762f);
    path.quadTo(167.578f, 67.1504f, 167.578f, 67.5898f);
    path.quadTo(167.578f, 67.7852f, 167.676f, 67.7852f);
    path.lineTo(168.994f, 70.0801f);
    path.lineTo(168.701f, 76.7207f);
    path.lineTo(169.824f, 83.4102f);
    path.close();
    return path;
}

/* Generated on a Mac with:
 * paint.setTypeface(SkTypeface::CreateByName("Hiragino Maru Gothic Pro"));
 * const unsigned char hyphen[] = { 0xE3, 0x83, 0xBC };
 * paint.getTextPath(hyphen, SK_ARRAY_COUNT(hyphen), 400, 80, &textPath);
 */
static SkPath hiragino_maru_gothic_pro_dash() {
    SkPath path;
    path.moveTo(488, 55.1f);
    path.cubicTo(490.5f, 55.1f, 491.9f, 53.5f, 491.9f, 50.8f);
    path.cubicTo(491.9f, 48.2f, 490.5f, 46.3f, 487.9f, 46.3f);
    path.lineTo(412, 46.3f);
    path.cubicTo(409.4f, 46.3f, 408, 48.2f, 408, 50.8f);
    path.cubicTo(408, 53.5f, 409.4f, 55.1f, 411.9f, 55.1f);
    path.lineTo(488, 55.1f);
    path.close();
    return path;
}

static void show_bold(SkCanvas* canvas, const char* text,
                      SkScalar x, SkScalar y, const SkPaint& paint, const SkFont& font) {
        canvas->drawString(text, x, y, font, paint);
        SkFont f(font);
        f.setEmbolden(true);
        canvas->drawString(text, x, y + 120, f, paint);
}

static void path_bold(SkCanvas* canvas, const SkPath& path,
                      const SkPaint& paint, float textSize) {
        SkPaint p(paint);
        canvas->drawPath(path, p);
        p.setStyle(SkPaint::kStrokeAndFill_Style);
        SkScalar fakeBoldScale = SkScalarInterpFunc(textSize,
                kStdFakeBoldInterpKeys, kStdFakeBoldInterpValues,
                kStdFakeBoldInterpLength);
        SkScalar extra = textSize * fakeBoldScale;
        p.setStrokeWidth(extra);
        canvas->save();
        canvas->translate(0, 120);
        canvas->drawPath(path, p);
        canvas->restore();
}

DEF_SIMPLE_GM_BG_NAME(strokefill, canvas, 640, 480, SK_ColorWHITE,
                      SkString("stroke-fill")) {
        SkScalar x = SkIntToScalar(100);
        SkScalar y = SkIntToScalar(88);

        // use the portable typeface to generically test the fake bold code everywhere
        // (as long as the freetype option to do the bolding itself isn't enabled)
        SkFont  font(ToolUtils::create_portable_typeface("serif", SkFontStyle()), 100);
        SkPaint paint;
        paint.setAntiAlias(true);
        paint.setStrokeWidth(SkIntToScalar(5));

        // use paths instead of text to test the path data on all platforms, since the
        // Mac-specific font may change or is not available everywhere
        path_bold(canvas, papyrus_hello(), paint, font.getSize());
        path_bold(canvas, hiragino_maru_gothic_pro_dash(), paint, font.getSize());

        show_bold(canvas, "Hi There", x + SkIntToScalar(430), y, paint, font);

        paint.setStyle(SkPaint::kStrokeAndFill_Style);

        SkPath path;
        path.setFillType(SkPath::kWinding_FillType);
        path.addCircle(x, y + SkIntToScalar(200), SkIntToScalar(50), SkPath::kCW_Direction);
        path.addCircle(x, y + SkIntToScalar(200), SkIntToScalar(40), SkPath::kCCW_Direction);
        canvas->drawPath(path, paint);

        SkPath path2;
        path2.setFillType(SkPath::kWinding_FillType);
        path2.addCircle(x + SkIntToScalar(120), y + SkIntToScalar(200), SkIntToScalar(50), SkPath::kCCW_Direction);
        path2.addCircle(x + SkIntToScalar(120), y + SkIntToScalar(200), SkIntToScalar(40), SkPath::kCW_Direction);
        canvas->drawPath(path2, paint);

        path2.reset();
        path2.addCircle(x + SkIntToScalar(240), y + SkIntToScalar(200), SkIntToScalar(50), SkPath::kCCW_Direction);
        canvas->drawPath(path2, paint);
        SkASSERT(SkPathPriv::CheapIsFirstDirection(path2, SkPathPriv::kCCW_FirstDirection));

        path2.reset();
        SkASSERT(!SkPathPriv::CheapComputeFirstDirection(path2, nullptr));
        path2.addCircle(x + SkIntToScalar(360), y + SkIntToScalar(200), SkIntToScalar(50), SkPath::kCW_Direction);
        SkASSERT(SkPathPriv::CheapIsFirstDirection(path2, SkPathPriv::kCW_FirstDirection));
        canvas->drawPath(path2, paint);

        SkRect r = SkRect::MakeXYWH(x - SkIntToScalar(50), y + SkIntToScalar(280),
                                    SkIntToScalar(100), SkIntToScalar(100));
        SkPath path3;
        path3.setFillType(SkPath::kWinding_FillType);
        path3.addRect(r, SkPath::kCW_Direction);
        r.inset(SkIntToScalar(10), SkIntToScalar(10));
        path3.addRect(r, SkPath::kCCW_Direction);
        canvas->drawPath(path3, paint);

        r = SkRect::MakeXYWH(x + SkIntToScalar(70), y + SkIntToScalar(280),
                             SkIntToScalar(100), SkIntToScalar(100));
        SkPath path4;
        path4.setFillType(SkPath::kWinding_FillType);
        path4.addRect(r, SkPath::kCCW_Direction);
        r.inset(SkIntToScalar(10), SkIntToScalar(10));
        path4.addRect(r, SkPath::kCW_Direction);
        canvas->drawPath(path4, paint);

        r = SkRect::MakeXYWH(x + SkIntToScalar(190), y + SkIntToScalar(280),
                             SkIntToScalar(100), SkIntToScalar(100));
        path4.reset();
        SkASSERT(!SkPathPriv::CheapComputeFirstDirection(path4, nullptr));
        path4.addRect(r, SkPath::kCCW_Direction);
        SkASSERT(SkPathPriv::CheapIsFirstDirection(path4, SkPathPriv::kCCW_FirstDirection));
        path4.moveTo(0, 0); // test for crbug.com/247770
        canvas->drawPath(path4, paint);

        r = SkRect::MakeXYWH(x + SkIntToScalar(310), y + SkIntToScalar(280),
                             SkIntToScalar(100), SkIntToScalar(100));
        path4.reset();
        SkASSERT(!SkPathPriv::CheapComputeFirstDirection(path4, nullptr));
        path4.addRect(r, SkPath::kCW_Direction);
        SkASSERT(SkPathPriv::CheapIsFirstDirection(path4, SkPathPriv::kCW_FirstDirection));
        path4.moveTo(0, 0); // test for crbug.com/247770
        canvas->drawPath(path4, paint);
}

DEF_SIMPLE_GM(bug339297, canvas, 640, 480) {
    SkPath path;
    path.moveTo(-469515, -10354890);
    path.cubicTo(771919.62f, -10411179, 2013360.1f, -10243774, 3195542.8f, -9860664);
    path.lineTo(3195550, -9860655);
    path.lineTo(3195539, -9860652);
    path.lineTo(3195539, -9860652);
    path.lineTo(3195539, -9860652);
    path.cubicTo(2013358.1f, -10243761, 771919.25f, -10411166, -469513.84f, -10354877);
    path.lineTo(-469515, -10354890);
    path.close();

    canvas->translate(258, 10365663);

    SkPaint paint;
    paint.setAntiAlias(true);
    paint.setColor(SK_ColorBLACK);
    paint.setStyle(SkPaint::kFill_Style);
    canvas->drawPath(path, paint);

    paint.setColor(SK_ColorRED);
    paint.setStyle(SkPaint::kStroke_Style);
    paint.setStrokeWidth(1);
    canvas->drawPath(path, paint);
}

DEF_SIMPLE_GM(bug339297_as_clip, canvas, 640, 480) {
    SkPath path;
    path.moveTo(-469515, -10354890);
    path.cubicTo(771919.62f, -10411179, 2013360.1f, -10243774, 3195542.8f, -9860664);
    path.lineTo(3195550, -9860655);
    path.lineTo(3195539, -9860652);
    path.lineTo(3195539, -9860652);
    path.lineTo(3195539, -9860652);
    path.cubicTo(2013358.1f, -10243761, 771919.25f, -10411166, -469513.84f, -10354877);
    path.lineTo(-469515, -10354890);
    path.close();

    canvas->translate(258, 10365663);

    canvas->save();
    canvas->clipPath(path, true);
    canvas->clear(SK_ColorBLACK);
    canvas->restore();

    SkPaint paint;
    paint.setAntiAlias(true);
    paint.setStyle(SkPaint::kFill_Style);
    paint.setColor(SK_ColorRED);
    paint.setStyle(SkPaint::kStroke_Style);
    paint.setStrokeWidth(1);
    canvas->drawPath(path, paint);
}

DEF_SIMPLE_GM(bug6987, canvas, 200, 200) {
    SkPaint paint;
    paint.setStyle(SkPaint::kStroke_Style);
    paint.setStrokeWidth(0.0001f);
    paint.setAntiAlias(true);
    SkPath path;
    canvas->save();
    canvas->scale(50000.0f, 50000.0f);
    path.moveTo(0.0005f, 0.0004f);
    path.lineTo(0.0008f, 0.0010f);
    path.lineTo(0.0002f, 0.0010f);
    path.close();
    canvas->drawPath(path, paint);
    canvas->restore();
}
