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

static VGubyte rect_cmd[] = {
    VG_MOVE_TO_ABS, VG_LINE_TO_ABS, VG_LINE_TO_ABS, VG_LINE_TO_ABS, VG_CLOSE_PATH
};

static VGuint rect_coord[] = {
    0, 0,  200, 0, 200, 200, 0, 200,
};

/* シザー枠 */
static VGint ScissorRects[] = {
    80, 80, 80, 80,
    200, 50, 200, 50,
    10, 110, 30, 30,
    50, 150, 300, 80,
    -50, 300, 90, 200,
    150, 250, 300, 300,
    500, 10, 100, 450

};

/* オブジェクト */
static VGPath path;
static VGPaint paint;

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(rect_cmd), rect_cmd, rect_coord);

    /* VGPaintオブジェクトの生成 */
    paint = vgCreatePaint();

    /* カラーペイントに設定 */
    vgSetParameteri(paint, VG_PAINT_TYPE, VG_PAINT_TYPE_COLOR);

    /* 生成したペイントをFILL描画に設定 */
    vgSetPaint(paint, VG_FILL_PATH);

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

    /* 行列初期化 */
    vgLoadIdentity();
}

static void DrawWithScissor(void)
{
    vgScale(3.2F, 2.4F);

    /* シザー枠の指定 */
    vgSetiv(VG_SCISSOR_RECTS,
            sizeof(ScissorRects)/sizeof(ScissorRects[0]),
            ScissorRects);

    /* シザー処理の無効化 */
    vgSeti(VG_SCISSORING, VG_FALSE);

    /* 描画色の設定（赤） */
    vgSetColor(paint, 0xFF0000FF);

    /* 描画 */
    vgDrawPath(path, VG_FILL_PATH);

    /* シザー処理の有効化 */
    vgSeti(VG_SCISSORING, VG_TRUE);

    /* 描画色の設定（緑） */
    vgSetColor(paint, 0x00FF00FF);

    /* 描画 */
    vgDrawPath(path, VG_FILL_PATH);
}

static void TestTerm(void)
{
    /* FILL描画を初期化 */
    vgSetPaint(VG_INVALID_HANDLE, VG_FILL_PATH);

    /* シザー処理の無効化 */
    vgSeti(VG_SCISSORING, VG_FALSE);

    /* オブジェクトを破棄 */
    vgDestroyPath(path);
    vgDestroyPaint(paint);
}

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

    /* パス描画処理 */
    DrawWithScissor();

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

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