スポンサーリンク

FreeType2 FT_Set_Transformで文字を回転させて出力(1)

FT_Set_Transform , FT_Load_Glyph , FT_Render_Glyph の順で呼び出すと文字を回転させられる。

注意点としてはFT_Set_Transformに与えるFT_Matrixの要素はfloat型ではなく、FT_Fixedという整数型。

 

#include <iostream>
#include <vector>

#include <ft2build.h>
#include FT_FREETYPE_H


#pragma warning(disable:4996)

#pragma comment(lib,"freetype.lib")


void pnmP2_Write(
  const char* const fname,
  const int width,
  const int height,
  const unsigned char* const p);

#pragma warning(disable:4996)
int main()
{

  FT_Library  library; // handle to library
  FT_Error error;

  error = FT_Init_FreeType(&library);
  if (error)
    return -1;

  FT_Face face;    // handle to face object

  // フォントファイル読み込み
  error = FT_New_Face(
    library,
    "C:\\Windows\\Fonts\\meiryo.ttc",
    0,
    &face
  );

  //文字コード指定
  error = FT_Select_Charmap(
    face,         // target face object
    FT_ENCODING_UNICODE // エンコード指定
  );


  if (error == FT_Err_Unknown_File_Format)
    return -1;
  else if (error)
    return -1;

  //この二つの値でフォントサイズ調整
  FT_F26Dot6 fontsize = 16 * 64;
  FT_UInt CHAR_RESOLUTION = 300;
  error = FT_Set_Char_Size(
    face,        // handle to face object
    0,           // char_width in 1/64th of points
    fontsize,      // char_height in 1/64th of points
    CHAR_RESOLUTION,   // horizontal device resolution
    CHAR_RESOLUTION);  // vertical device resolution

    // 文字の取得
  FT_ULong character = wchar_t(L'あ');
  FT_UInt char_index = FT_Get_Char_Index(face, character);

  double theta = 45.0 * 3.1415 / 180.0;
  // matrix.xxの型はFT_Fixedだが、これは typedef signed long FT_Fixed
  FT_Matrix  matrix;
  matrix.xx = (FT_Fixed)(cos(theta) * 0x10000L);
  matrix.xy = (FT_Fixed)(-sin(theta) * 0x10000L);
  matrix.yx = (FT_Fixed)(sin(theta) * 0x10000L);
  matrix.yy = (FT_Fixed)(cos(theta) * 0x10000L);
  FT_Set_Transform(face, &matrix, 0);
  // グリフ(字の形状)読込
  error = FT_Load_Glyph(face, char_index, FT_LOAD_RENDER);
  if (error)
    return -1; // ignore errors


    // 文字を画像化
  FT_Render_Glyph(face->glyph, FT_RENDER_MODE_NORMAL);
  
  int Width = face->glyph->bitmap.width;
  int Height = face->glyph->bitmap.rows;
  pnmP2_Write(// ファイル保存
    "C:\\MyData\\freetypetest.pgm",
    Width,
    Height,
    face->glyph->bitmap.buffer
  );

  // FreeType2の解放
  FT_Done_Face(face);
  FT_Done_FreeType(library);
}

//! @brief Portable Gray map
//! @param [in] fname ファイル名
//! @param [in] width 画像の幅
//! @param [in] height 画像の高さ
//! @param [in] p 画像のメモリへのアドレス
//! @details RGBRGBRGB....のメモリを渡すと、RGBテキストでファイル名fnameで書き込む
void pnmP2_Write(
  const char* const fname,
  const int width,
  const int height,
  const unsigned char* const p) { // PPM ASCII

  FILE* fp = fopen(fname, "wb");
  fprintf(fp, "P2\n%d %d\n%d\n", width, height, 255);

  size_t k = 0;
  for (size_t i = 0; i < (size_t)height; i++) {
    for (size_t j = 0; j < (size_t)width; j++) {
      fprintf(fp, "%d ", p[k]);
      k++;
    }
    fprintf(fp, "\n");
  }

  fclose(fp);
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: