/*
*  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 VGfloat color[4] = {
    1.0F, 0.5F, 0.5F, 1.0F
};

static VGfloat linearGradient[4] = {
    50, 50, 150, 150
};

static VGfloat radialGradient[5] = {
    100, 100, 40, 40, 80
};

static VGfloat rampStops[] = {
    0.0F, 1.0F, 0.0F, 0.0F, 1.0F,
    0.5F, 0.0F, 1.0F, 0.0F, 1.0F,
    1.0F, 0.0F, 0.0F, 1.0F, 1.0F,
};

/* オブジェクト */
static VGPath path;
static VGImage image;

static void *image_data;

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

    /* 画像を読込 */
    image_data = GfxGetFreeArea(PAT_WIDTH, PAT_HEIGHT, PAT_BPP<<3);
    GfxFsRead((int8_t*)PAT_NAME, PAT_STRIDE * PAT_HEIGHT, (void*)image_data);

    /* 描画サーフェスのクリアカラーを指定 */
    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);

    /* VGImageオブジェクトの生成 */
    image = vgCreateImage(VG_sRGBA_8888, PAT_WIDTH, PAT_HEIGHT, VG_IMAGE_QUALITY_NONANTIALIASED | VG_IMAGE_QUALITY_FASTER | VG_IMAGE_QUALITY_BETTER);

    /* VGImageオブジェクトにイメージデータを登録 */
    vgImageSubData(image, image_data, PAT_STRIDE, VG_sRGBA_8888, 0, 0, PAT_WIDTH, PAT_HEIGHT);

    /* カレントマトリクスをPATH_USER_TO_SURFACEに設定 */
    vgSeti(VG_MATRIX_MODE, VG_MATRIX_PATH_USER_TO_SURFACE);
}

static void DrawWithPaint(void)
{
    VGPaint paint;

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

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

    /* カラーペイントの設定と描画 */
    vgSetParameteri(paint, VG_PAINT_TYPE, VG_PAINT_TYPE_COLOR);
    /* ペイントカラーの指定 */
    vgSetParameterfv(paint, VG_PAINT_COLOR, 4, color);
    /* 画面左下に描画 */
    vgLoadIdentity();
    vgTranslate(80, 30);
    vgDrawPath(path, VG_FILL_PATH);

    /* カラーランプテーブル（グラデーション）の設定 */
    vgSetParameterfv(paint, VG_PAINT_COLOR_RAMP_STOPS, sizeof(rampStops)/sizeof(rampStops[0]), rampStops);

    /* リニアグラディエントの設定と描画 */
    vgSetParameteri(paint, VG_PAINT_TYPE, VG_PAINT_TYPE_LINEAR_GRADIENT);
    /* リニアグラディエントのパラメータを設定 */
    vgSetParameterfv(paint, VG_PAINT_LINEAR_GRADIENT, 4, linearGradient);
    /* 画面右下に描画 */
    vgLoadIdentity();
    vgTranslate(360, 30);
    vgDrawPath(path, VG_FILL_PATH);

    /* ラディアルグラディエントの設定と描画 */
    vgSetParameteri(paint, VG_PAINT_TYPE, VG_PAINT_TYPE_RADIAL_GRADIENT);
    /* ラディアルグラディエントのパラメータを設定 */
    vgSetParameterfv(paint, VG_PAINT_RADIAL_GRADIENT, 5, radialGradient);
    /* 画面左上に描画 */
    vgLoadIdentity();
    vgTranslate(80, 250);
    vgDrawPath(path, VG_FILL_PATH);

    /* パタンペイントの設定と描画 */
    vgSetParameteri(paint, VG_PAINT_TYPE, VG_PAINT_TYPE_PATTERN);
    /* パタンペイントとして使用するVGImageを設定 */
    vgPaintPattern(paint, image);
    /* パタンペイントを繰り返しモードに指定 */
    vgSetParameteri(paint, VG_PAINT_PATTERN_TILING_MODE, VG_TILE_REPEAT);
    /* 画面右上に描画 */
    vgLoadIdentity();
    vgTranslate(360, 250);
    vgDrawPath(path, VG_FILL_PATH);

    /* ペイントオブジェクトの破棄 */
    vgDestroyPaint(paint);

    /* FILL描画を初期化 */
    vgSetPaint(VG_INVALID_HANDLE, VG_FILL_PATH);
}

static void TestTerm(void)
{
    GfxReleaseFreeArea(image_data);

    /* オブジェクトの破棄 */
    vgDestroyPath(path);
    vgDestroyImage(image);
}

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

    /* ペイント描画処理 */
    DrawWithPaint();

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

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