/*
*  This program was created by AXELL CORPORATION.
*  Copyright (C) 2017 AXELL CORPORATION, all rights reserved.
*/
#include "gfx_sample.h"

/* 形状データ */
static VGubyte cmd[] = {
    VG_MOVE_TO_ABS, VG_LINE_TO_ABS, VG_LINE_TO_ABS
};
static VGint coord[] = {
    0, 100, 0, 0, 200, 0
};

/* ダッシュパタン */
static VGint DashPattern0[] = {40, 30};
static VGint DashPattern1[] = {0, 20};

static VGPath path;

static void TestInit(int width, int height)
{
    VGfloat ClearColor[4]  = {1.0F, 1.0F, 1.0F, 1.0F};

    /* 描画サーフェスのクリアカラーを指定 */
    vgSetfv(VG_CLEAR_COLOR, 4, ClearColor);

    /* 描画サーフェス全体をクリア */
    vgClear(0, 0, width, height);

    /* VGPathオブジェクトの生成 */
    path = vgCreatePath(VG_PATH_FORMAT_STANDARD, VG_PATH_DATATYPE_S_32, 1.0F, 0.0F, 0, 0, VG_PATH_CAPABILITY_ALL);

    /* VGPathオブジェクトに形状データを登録 */
    vgAppendPathData(path, sizeof(cmd), cmd, coord);

    /* 現在のマトリクスをパス変換マトリクスに設定 */
    vgSeti(VG_MATRIX_MODE, VG_MATRIX_PATH_USER_TO_SURFACE);
}

static void TestDraw(VGPath path, VGint lineWidth, VGCapStyle cap,
                     VGJoinStyle join, VGint dashCount,
                     VGint *dashPattern, VGint x, VGint y)
{
    /* ストロークの幅を設定 */
    vgSeti(VG_STROKE_LINE_WIDTH, lineWidth);

    /* エンドキャップ形状の設定 */
    vgSeti(VG_STROKE_CAP_STYLE, cap);

    /* ジョイン形状の設定 */
    vgSeti(VG_STROKE_JOIN_STYLE, join);

    /* ダッシュパタンの設定 */
    vgSetiv(VG_STROKE_DASH_PATTERN, dashCount, dashPattern);

    /* 指定した位置にストローク描画 */
    vgLoadIdentity();
    vgTranslate(x, y);
    vgDrawPath(path, VG_STROKE_PATH);
}

static void TestTerm(void)
{
    /* VGPathオブジェクトを破棄 */
    vgDestroyPath(path);
}

void StrokeMain(void)
{
    /* 初期化処理 */
    TestInit(GFX_WIDTH, GFX_HEIGHT);

    /* ケース１：線幅15pixel、キャップ=BUTT、ジョイン=MITER、ダッシュ処理なし */
    TestDraw(path, 15, VG_CAP_BUTT, VG_JOIN_MITER, 0, 0, 50, 50);
    /* ケース２：線幅15pixel、キャップ=BUTT、ジョイン=MITER、ダッシュ処理あり */
    TestDraw(path, 15, VG_CAP_BUTT, VG_JOIN_MITER, sizeof(DashPattern0)/sizeof(DashPattern0[0]), DashPattern0, 100, 100);
    /* ケース３：線幅15pixel、キャップ=ROUND、ジョイン=ROUND、ダッシュ処理なし */
    TestDraw(path, 15, VG_CAP_ROUND, VG_JOIN_ROUND, 0, 0, 150, 150);
    /* ケース４：線幅15pixel、キャップ=ROUND、ジョイン=ROUND、ダッシュ処理あり */
    TestDraw(path, 15, VG_CAP_ROUND, VG_JOIN_ROUND, sizeof(DashPattern0)/sizeof(DashPattern0[0]), DashPattern0, 200, 200);
    /* ケース５：線幅15pixel、キャップ=SQUARE、ジョイン=BEVEL、ダッシュ処理なし */
    TestDraw(path, 15, VG_CAP_SQUARE, VG_JOIN_BEVEL, 0, 0, 250, 250);
    /* ケース６：線幅15pixel、キャップ=SQUARE、ジョイン=BEVEL、ダッシュ処理あり */
    TestDraw(path, 15, VG_CAP_SQUARE, VG_JOIN_BEVEL, sizeof(DashPattern0)/sizeof(DashPattern0[0]), DashPattern0, 300, 300);
    /* ケース７：線幅15pixel、キャップ=ROUND、ジョイン=ROUND、ダッシュ処理あり */
    TestDraw(path, 15, VG_CAP_ROUND, VG_JOIN_ROUND, sizeof(DashPattern1)/sizeof(DashPattern1[1]), DashPattern1, 350, 350);

    /* バッファースワップ */
    GfxSwapBuffer();

    /* 終了処理 */
    TestTerm();
}
