

#include <vcl.h>
#pragma hdrstop


#include  "GUI_Bitmap.h"

#include  "vmos_def.h"
#include  "vmos.h"
#include  "c_define.h"

//[GUI]
//{
    #include  "gui_part.h"

    #include  "ide_library.h"

    #include  "gui.h"

//}


void __fastcall _Gui_Bitmap_Create(void)
{
  //[2021.05.29.토][생성]

  //[VAR]
  //{
      //[기본]
      //{
          class  VMOS  *vmos;

          //<@LOCAL> 을 기본으로 한 [절대주소](대문자로 절대주소임을 구분하자).
          DTU8   ADR;

      //}

      //[API]
      //{
          //반환값.
          DTU8  rReturn; //주소.

      //}

      //[대상 개체]
      //{
          Graphics::TBitmap  *bmp_;

      //}

  //}

  //[VMOS 위치 얻기]{--
  VMOS_GetPtr(&vmos);
  //}------------------

  //[함수형]{-------------------
  //void * _Bitmap_생성_(void);
  //}---------------------------

  //[기본주소 얻기]
  //{
      //[!]{--------------------------------------------------------
      //<@LOCAL> 과 같은 [절대주소] 값.
      //함수 [인수] 등 모든 지역변수는 <@LOCAL> 부터 시작되기 때문.
      //첫번째 [지역변수(인수포함)] 의 [절대주소] 가 된다.
      //}-----------------------------------------------------------

      ADR = (vmos->regREG_[d_VM_Reg_LOCAL]);

  //}

  //[명령처리]
  //{
      //[!]{------------------------------------------------------------------
      //생성후 주소 반환은 [맷돌C] 에서 바로 접근할수 있도록 <F:주소> 로
      //<64 비트> 의 VMOS 주소로 확장하여 반환.
      //
      //VMOS 에서는 <F:0 - F:F> 까지는 장치주소(실제물리주소, BCB 의 주소) 에
      //매핑되어 직접 접근 가능하다.
      //}---------------------------------------------------------------------

      bmp_ = new Graphics::TBitmap;

      bmp_->PixelFormat = pf24bit;

      rReturn = (0xffffffff00000000|((DTU8)(bmp_)));

  //}

  //[결과 반환]
  //{
      //[값] 쓰기.
      if(vmos->VMOS_WrRd(d_Wr, ADR, (8), (DTU1 *)(&rReturn)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

  //}

}

void __fastcall _Gui_Bitmap_Delete(void)
{
  //[2021.05.29.토][생성]

  //[VAR]
  //{
      //[기본]
      //{
          class  VMOS  *vmos;

          //<@LOCAL> 을 기본으로 한 [절대주소](대문자로 절대주소임을 구분하자).
          DTU8   ADR;

      //}

      //[API]
      //{
          //주소는 전부 MCU 상의 주소다.
          DTU8   pBitmap; //주소.

      //}

      //[대상 개체]
      //{
          Graphics::TBitmap  *bmp_;

      //}

  //}

  //[VMOS 위치 얻기]{--
  VMOS_GetPtr(&vmos);
  //}------------------

  //[함수형]{---------------------------
  //void _Bitmap_삭제_(void  *p비트맵);
  //}-----------------------------------

  //[기본주소 얻기]
  //{
      //[!]{--------------------------------------------------------
      //<@LOCAL> 과 같은 [절대주소] 값.
      //함수 [인수] 등 모든 지역변수는 <@LOCAL> 부터 시작되기 때문.
      //첫번째 [지역변수(인수포함)] 의 [절대주소] 가 된다.
      //}-----------------------------------------------------------

      ADR = (vmos->regREG_[d_VM_Reg_LOCAL]);

  //}

  //[void  *p비트맵]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pBitmap)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //MCU 내부적으로처리 하므로 실제 물리주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pBitmap, &pBitmap);

  //}

  //[명령처리]
  //{
      bmp_ = (Graphics::TBitmap *)pBitmap;

      if(bmp_ != NULL) { delete bmp_; }

  //}

}

void __fastcall _Gui_Bitmap_Width(void)
{
  //[2021.05.29.토][생성]

  //[VAR]
  //{
      //[기본]
      //{
          class  VMOS  *vmos;

          //<@LOCAL> 을 기본으로 한 [절대주소](대문자로 절대주소임을 구분하자).
          DTU8   ADR;

      //}

      //[API]
      //{
          //주소는 전부 MCU 상의 주소다.
          DTU8   pBitmap;  //주소.
          DTU4   pWidth;
          DTU1   pWR;

          //반환값
          DTU4   pReturn;

      //}

      //[대상 개체]
      //{
          Graphics::TBitmap  *bmp_;

      //}

  //}

  //[VMOS 위치 얻기]{--
  VMOS_GetPtr(&vmos);
  //}------------------

  //[함수형]{--------------------------------------------
  //unsigned int _Bitmap_폭_(void           *p비트맵,
  //                         unsigned int    p폭,
  //                         unsigned char   p쓰기읽기);
  //}----------------------------------------------------

  //[기본주소 얻기]
  //{
      //[!]{--------------------------------------------------------
      //<@LOCAL> 과 같은 [절대주소] 값.
      //함수 [인수] 등 모든 지역변수는 <@LOCAL> 부터 시작되기 때문.
      //첫번째 [지역변수(인수포함)] 의 [절대주소] 가 된다.
      //}-----------------------------------------------------------

      ADR = (vmos->regREG_[d_VM_Reg_LOCAL]);

  //}

  //[void  *p비트맵]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pBitmap)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //MCU 내부적으로처리 하므로 실제 물리주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pBitmap, &pBitmap);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[unsigned int  p폭]
  //{
      //[값] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (4), (DTU1 *)(&pWidth)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (4);
      //}--------------------------

  //}

  //[unsigned char  p쓰기읽기]
  //{
      //[값] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (1), (DTU1 *)(&pWR)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (1);
      //}--------------------------

  //}

  //[명령처리]
  //{
      bmp_ = (Graphics::TBitmap *)pBitmap;

      switch(pWR)
      {
        case d_Wr :
        {
          bmp_->Width = pWidth;

        } break;

        case d_Rd :
        {
          //[반환값 얻기]
          //{
              pReturn = bmp_->Width;

          //}

          //[값] 쓰기.
          if(vmos->VMOS_WrRd(d_Wr, ADR, (4), (DTU1 *)(&pReturn)) != true)
          { vmos->regSysFuncCallResult = d_False; return; }

        } break;

      }

  //}

}

void __fastcall _Gui_Bitmap_Height(void)
{
  //[2021.05.29.토][생성]

  //[VAR]
  //{
      //[기본]
      //{
          class  VMOS  *vmos;

          //<@LOCAL> 을 기본으로 한 [절대주소](대문자로 절대주소임을 구분하자).
          DTU8   ADR;

      //}

      //[API]
      //{
          //주소는 전부 MCU 상의 주소다.
          DTU8   pBitmap;  //주소.
          DTU4   pHeight;
          DTU1   pWR;

          //반환값
          DTU4   pReturn;

      //}

      //[대상 개체]
      //{
          Graphics::TBitmap  *bmp_;

      //}

  //}

  //[VMOS 위치 얻기]{--
  VMOS_GetPtr(&vmos);
  //}------------------

  //[함수형]{----------------------------------------------
  //unsigned int _Bitmap_높이_(void           *p비트맵,
  //                           unsigned int    p높이,
  //                           unsigned char   p쓰기읽기);
  //}------------------------------------------------------

  //[기본주소 얻기]
  //{
      //[!]{--------------------------------------------------------
      //<@LOCAL> 과 같은 [절대주소] 값.
      //함수 [인수] 등 모든 지역변수는 <@LOCAL> 부터 시작되기 때문.
      //첫번째 [지역변수(인수포함)] 의 [절대주소] 가 된다.
      //}-----------------------------------------------------------

      ADR = (vmos->regREG_[d_VM_Reg_LOCAL]);

  //}

  //[void  *p비트맵]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pBitmap)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //MCU 내부적으로처리 하므로 실제 물리주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pBitmap, &pBitmap);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[unsigned int  p높이]
  //{
      //[값] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (4), (DTU1 *)(&pHeight)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (4);
      //}--------------------------

  //}

  //[unsigned char  p쓰기읽기]
  //{
      //[값] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (1), (DTU1 *)(&pWR)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (1);
      //}--------------------------

  //}

  //[명령처리]
  //{
      bmp_ = (Graphics::TBitmap *)pBitmap;

      switch(pWR)
      {
        case d_Wr :
        {
          bmp_->Height = pHeight;

        } break;

        case d_Rd :
        {
          //[반환값 얻기]
          //{
              pReturn = bmp_->Height;

          //}

          //[값] 쓰기.
          if(vmos->VMOS_WrRd(d_Wr, ADR, (4), (DTU1 *)(&pReturn)) != true)
          { vmos->regSysFuncCallResult = d_False; return; }

        } break;

      }

  //}

}

void __fastcall _Gui_Bitmap_LoadFromFile(void)
{
  //[2021.05.29.토][생성]

  //[VAR]
  //{
      //[기본]
      //{
          class  VMOS  *vmos;

          //<@LOCAL> 을 기본으로 한 [절대주소](대문자로 절대주소임을 구분하자).
          DTU8   ADR;

      //}

      //[API]
      //{
          //주소는 전부 MCU 상의 주소다.
          DTU8   pBitmap;     //주소.
          DTU8   pPathNameExt; //주소.

          //반환값
          DTU1   pReturn;   //bool

      //}

      //[대상 개체]
      //{
          Graphics::TBitmap  *bmp_;

      //}

      char  ext[1024];

  //}

  //[VMOS 위치 얻기]{--
  VMOS_GetPtr(&vmos);
  //}------------------

  //[함수형]{--------------------------------------------
  //unsigned char _Bitmap_열기_(void  *p비트맵,
  //                            char  *p경로이름확장자);
  //}----------------------------------------------------

  //[기본주소 얻기]
  //{
      //[!]{--------------------------------------------------------
      //<@LOCAL> 과 같은 [절대주소] 값.
      //함수 [인수] 등 모든 지역변수는 <@LOCAL> 부터 시작되기 때문.
      //첫번째 [지역변수(인수포함)] 의 [절대주소] 가 된다.
      //}-----------------------------------------------------------

      ADR = (vmos->regREG_[d_VM_Reg_LOCAL]);

  //}

  //[void  *p비트맵]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pBitmap)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //MCU 내부적으로처리 하므로 실제 물리주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pBitmap, &pBitmap);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[char  *p경로이름확장자]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pPathNameExt)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //MCU 내부적으로처리 하므로 실제 물리주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pPathNameExt, &pPathNameExt);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[명령처리]
  //{
      pReturn = true;

      //[그림지정이 "" 인가?]
      //{
          //[!]{-------------------------------
          //지정 그림이 없는 경우는 그냥 종료.
          //}----------------------------------

          if(((char *)pPathNameExt)[0] == '\0')
          {
            pReturn = false;

            goto lbReturn;

          }

      //}

      //[문서 존재 확인]
      //{
          //[!]{---------------------------------------------------
          //반드시 [그림] 이 존재하는 것인지 확인한다.
          //그렇지 않는 경우는 VMOS 상에서 심각한 오류가 발생한다.
          //}------------------------------------------------------

          if(FileExists((char *)pPathNameExt) != true)
          {
            //그림이 존재하지 않는다면 처리하지 않고 바로 종료한다.
            pReturn = false;

            goto lbReturn;

          }

      //}

      //[확장자 검사]
      //{
          //[!]{-------------
          //<bmp> 인지 확인.
          //}----------------

          //[확장자] 추출.
          STR_GetFileExt((char *)pPathNameExt, ext);

          if(STR_Match_NoCase(ext, "bmp") != true)
          {
            //해당하지 않으므로 바로 종료.
            pReturn = false;

            goto lbReturn;

          }

      //}

      //[열기]
      //{
          bmp_ = (Graphics::TBitmap *)pBitmap;

          try
          {
            bmp_->LoadFromFile((char *)pPathNameExt);

          }
          catch(...)
          {
            //[!]{--------------------------------------------------------
            //확장자는 <bmp> 인데, 실제 그림은 <bmp> 가 아닌 경우에 해당.
            //이 경우는 위에서 열때 오류가 발생한다.
            //}-----------------------------------------------------------

            pReturn = false;

            goto lbReturn;

          }  

      //}
      
  //}

  lbReturn:

  //[반환값]
  //{
      if(vmos->VMOS_WrRd(d_Wr, ADR, (1), (DTU1 *)(&pReturn)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

  //}

}






