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

static void *dstAddr;
static void *image_data1, *image_data2;

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

    /* 画像を読込 */
    image_data1 = GfxGetFreeArea(IMAGE_WIDTH, IMAGE_HEIGHT, IMAGE_BPP<<3);
    GfxFsRead((int8_t*)IMAGE_NAME1, IMAGE_STRIDE * IMAGE_HEIGHT, (void*)image_data1);
    image_data2 = GfxGetFreeArea(IMAGE_WIDTH, IMAGE_HEIGHT, IMAGE_BPP<<3);
    GfxFsRead((int8_t*)IMAGE_NAME2, IMAGE_STRIDE * IMAGE_HEIGHT, (void*)image_data2);

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

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

    /* IMAGE_USER_TO_SURFACEを単位行列に設定 */
    vgSeti(VG_MATRIX_MODE, VG_MATRIX_IMAGE_USER_TO_SURFACE);
    vgLoadIdentity();

    /* */
    dstAddr = GfxGetFreeArea(IMAGE_WIDTH, IMAGE_HEIGHT, 32);
}

static void DrawDirectImage(void)
{
    VGImage directImage;

    /* DRAMにイメージデータを転送 */
    GfxWriteMemory(dstAddr, image_data1, IMAGE_STRIDE * IMAGE_HEIGHT);

    /* ダイレクトイメージ参照のオブジェクトを生成 */
    directImage = vgCreateDirectImageEXT(VG_sRGBA_8888,
                                         IMAGE_WIDTH,
                                         IMAGE_HEIGHT,
                                         VG_IMAGE_QUALITY_FASTER,
                                         dstAddr,
                                         IMAGE_STRIDE);

    /* 描画 */
    vgTranslate(100, 180);
    vgDrawImage(directImage);
    vgFinish();

    /* DRAMに別のイメージデータを転送 */
    GfxWriteMemory(dstAddr, image_data2, IMAGE_STRIDE * IMAGE_HEIGHT);

    /* 描画 */
    vgTranslate(280, 0);
    vgDrawImage(directImage);

    /* イメージオブジェクト破棄 */
    vgDestroyImage(directImage);

}

static void TestTerm(void)
{
    GfxReleaseFreeArea(image_data1);
    GfxReleaseFreeArea(image_data2);
    GfxReleaseFreeArea(dstAddr);
}

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

    /* ダイレクトイメージ描画 */
    DrawDirectImage();

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

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