/*
 * Draw_Buffer_ASCII_Expand_32x32.c
 *
 *  Created on: 2025/02/24
 *      Author: egaono-electronics
 */

#include "Draw_Buffer_ASCII_Expand_32x32.h"

#include "ILI9341_SPI_Draw.h"



//----------------------------------------------------------
// 描画Bufferに Font 32 x 32 の文字をセット
//----------------------------------------------------------
// 16 x 16 fontテーブルのデータを使用して
// 縦と横をそれぞれ2倍に引き伸ばし
//                      32 x 32 fontの文字を作成する。
//----------------------------------------------------------
// 引数;
// int16_t int16_Type :
//      0 : 通常表示
//      1 : 反転表示

// uint8_t *puint8_Address_font : フォント配列のポインタ

// uint16_t uint16_Length : 文字数
// uint16_t *puint16_aCode :
//                  文字コードが格納されたBufferのポインタ
// uint8_t *puint8_aBuffer : 描画Bufferのポインタ


// 戻り値:
//  なし
//----------------------------------------------------------
void Draw_Buffer_ASCII_Expand_32x32(int16_t int16_Type,
                                    uint8_t *puint8_Address_font,
                                    uint16_t uint16_Length,
                                    uint16_t *puint16_aCode,
                                    uint8_t *puint8_aBuffer)
{
  uint32_t uint32_AddressFont;

  uint32_t uint32_Position;

  uint32_t uint32_I;
  uint32_t uint32_J;
  uint32_t uint32_K;

  uint8_t uint8_Font;
  uint8_t uint8_Bit;

  uint16_t uint16_Font;
  uint16_t uint16_Bit;


  // 指定文字数分の処理を行う。
  for(uint32_I = 0; uint32_I < uint16_Length; uint32_I++){
    // 処理する文字コードの
    //              フォント配列の位置を算出してセットする。
    uint32_AddressFont
                    = (uint32_t)puint16_aCode[uint32_I] * 32;

    // フォントデータをBufferにセットする。
    for(uint32_J = 0;
        uint32_J < (uint32_t)def_DotLengthwise_Font16x16;
        uint32_J++){
      // フォントデータをセットするバッファの位置を計算
      uint32_Position
            = (uint32_t)uint16_Length * 8 * uint32_J
            + uint32_I * 4;

      //----------------------------------------------------
      // 前半 8bits
      //----------------------------------------------------
      // フォント配列 ASCII 16x16 から
      //    指定文字コードのフォントデータを抜き出す。
      uint8_Font
            = puint8_Address_font[
                        uint32_AddressFont + uint32_J * 2];

      //------------------------------------------------
      // フォントデータを2倍に引き伸ばす。
      //------------------------------------------------
      uint8_Bit = 0x80;
      uint16_Font = 0;
      uint16_Bit = 0x8000;
      for(uint32_K = 0; uint32_K < 8; uint32_K++){
        if((uint8_Font & uint8_Bit) == 0){
          uint16_Font &= (uint16_Bit ^ 0xFFFF);
          uint16_Bit >>= 1;
          uint16_Font &= (uint16_Bit ^ 0xFFFF);
          uint16_Bit >>= 1;
        }
        else{
          uint16_Font |= uint16_Bit;
          uint16_Bit >>= 1;
          uint16_Font |= uint16_Bit;
          uint16_Bit >>= 1;
        }

        uint8_Bit >>= 1;
      }
      //------------------------------------------------

      // バッファにフォントデータをセットする。
      if(int16_Type == 0){
        // 通常表示

        // 1行目をセット
        puint8_aBuffer[uint32_Position]
            = (uint8_t)((uint16_Font & 0xFF00) >> 8);
        puint8_aBuffer[uint32_Position + 1]
            = (uint8_t)(uint16_Font & 0x00FF);

        // 2行目をセット
        puint8_aBuffer[uint32_Position
                            + (uint32_t)uint16_Length * 4]
            = (uint8_t)((uint16_Font & 0xFF00) >> 8);
        puint8_aBuffer[uint32_Position
                            + (uint32_t)uint16_Length * 4 + 1]
            = (uint8_t)(uint16_Font & 0x00FF);
      }
      else{
        // 反転表示

        // 1行目をセット
        puint8_aBuffer[uint32_Position]
            = (uint8_t)((uint16_Font & 0xFF00) >> 8) ^ 0xFF;
        puint8_aBuffer[uint32_Position + 1]
            = (uint8_t)(uint16_Font & 0x00FF) ^ 0xFF;

        // 2行目をセット
        puint8_aBuffer[uint32_Position
                            + (uint32_t)uint16_Length * 4]
            = (uint8_t)((uint16_Font & 0xFF00) >> 8) ^ 0xFF;
        puint8_aBuffer[uint32_Position
                            + (uint32_t)uint16_Length * 4 + 1]
            = (uint8_t)(uint16_Font & 0x00FF) ^ 0xFF;
      }


      //----------------------------------------------------
      // 後半 8bits
      //----------------------------------------------------
      // フォント配列 ASCII 16x16 から
      //    指定文字コードのフォントデータを抜き出す。
      uint8_Font = puint8_Address_font[
                    uint32_AddressFont + uint32_J * 2 + 1];

      //------------------------------------------------
      // フォントデータを2倍に引き伸ばす。
      //------------------------------------------------
      uint8_Bit = 0x80;
      uint16_Font = 0;
      uint16_Bit = 0x8000;
      for(uint32_K = 0; uint32_K < 8; uint32_K++){
        if((uint8_Font & uint8_Bit) == 0){
          uint16_Font &= (uint16_Bit ^ 0xFFFF);
          uint16_Bit >>= 1;
          uint16_Font &= (uint16_Bit ^ 0xFFFF);
          uint16_Bit >>= 1;
        }
        else{
          uint16_Font |= uint16_Bit;
          uint16_Bit >>= 1;
          uint16_Font |= uint16_Bit;
          uint16_Bit >>= 1;
        }

        uint8_Bit >>= 1;
      }

      // バッファにフォントデータをセットする。
      if(int16_Type == 0){
        // 通常表示

        // 1行目をセット
        puint8_aBuffer[uint32_Position + 2]
            = (uint8_t)((uint16_Font & 0xFF00) >> 8);
        puint8_aBuffer[uint32_Position + 3]
            = (uint8_t)(uint16_Font & 0x00FF);

        // 2行目をセット
        puint8_aBuffer[uint32_Position
                        + (uint32_t)uint16_Length * 4 + 2]
            = (uint8_t)((uint16_Font & 0xFF00) >> 8);
        puint8_aBuffer[uint32_Position
                        + (uint32_t)uint16_Length * 4 + 3]
            = (uint8_t)(uint16_Font & 0x00FF);
      }
      else{
        // 反転表示

        // 1行目をセット
        puint8_aBuffer[uint32_Position + 2]
            = (uint8_t)((uint16_Font & 0xFF00) >> 8) ^ 0xFF;
        puint8_aBuffer[uint32_Position + 3]
            = (uint8_t)(uint16_Font & 0x00FF) ^ 0xFF;

        // 2行目をセット
        puint8_aBuffer[uint32_Position
                        + (uint32_t)uint16_Length * 4 + 2]
            = (uint8_t)((uint16_Font & 0xFF00) >> 8) ^ 0xFF;
        puint8_aBuffer[uint32_Position
                        + (uint32_t)uint16_Length * 4 + 3]
            = (uint8_t)(uint16_Font & 0x00FF) ^ 0xFF;
      }
    }
  }
}
