スポンサーリンク

Skiaでフォント使用(1)文字列描画

検索するとまず出てくるSkFontMgr::RefDefault()、SkTypeface::MakeFromFile()、...、あたりが、全部removedだった。SkFontMgr::RefEmpty()は失敗したときにエラーにならないための空機能フォントマネージャなので使えない。

とりあえずSkFontMgr_New_Custom_Directoryでフォントマネージャを作れることが分かった。

vcpkgで関連ライブラリのサポートの確認

以前vcpkg install skiaでSkiaを導入したが、どうやらこれではフォントや文字列関係が導入できないらしい。そこでvcpkg search skiaを打ってみる。

vcpkg search skia

すると、freetypeなどをサポートしたSkiaのパッケージ一覧が表示される。

>vcpkg search skia
msdfgen[geometry-preprocessing] Preprocessing of non-compliant vector geometry via the Skia library.
skia 123 Skia is an open source 2D graphics library which provides common APIs that...
skia[dawn] dawn support for skia
skia[direct3d] Direct3D support for skia
skia[fontconfig] Fontconfig support
skia[freetype] Freetype support
skia[gl] OpenGL support for skia
skia[graphite] Graphite support
skia[harfbuzz] Harfbuzz support
skia[icu] Use icu.
skia[metal] Metal support for skia
skia[vulkan] Vulkan support for skia
The result may be outdated. Run `git pull` to get the latest results.
If your port is not listed, please open an issue at and/or consider making a pull request. - https://github.com/Microsoft/vcpkg/issues

関連ありそうなfreetype,harfbuzz,icuのサポート付きのものをインストールする

vcpkg install skia[freetype,harfbuzz,icu]

以下のようにするとstatic link libraryになるのでdllが不要になる。

vcpkg install skia[freetype,harfbuzz,icu] --triplet x64-windows-static

サンプルコード

#include "include/core/SkCanvas.h"
#include "include/core/SkBitmap.h"
#include "include/core/SkImage.h"


// Png保存に必要
#include "include/encode/SkPngEncoder.h"
#include "include/core/SkStream.h"

// テキスト描画
#include "include/core/SkTypeface.h"
#include "include/core/SkFont.h"
#include "include/core/SkFontMgr.h"              // フォントマネージャ
#include "include/ports/SkFontMgr_directory.h" // フォントマネージャ作成
#include "include/core/SkFontMetrics.h"         // 表示位置の算出に使用
//#include "include/utils/SkTextUtils.h"
/////////////////////////////////////


void save(const SkBitmap& bitmap, const char* filename);

// テキスト描画のテスト
void TextTest() {
  
  //////////////////////////////////////////////////
  // フォントマネージャ作成
  sk_sp<SkFontMgr> fontmgr = SkFontMgr_New_Custom_Directory("C:\\Windows\\Fonts\\"); // フォントが格納されているディレクトリ指定

  // フォントの取得
  sk_sp<SkTypeface> typeface = fontmgr->makeFromFile("C:\\Windows\\Fonts\\Msgothic.ttc", 0);

  // フォントの設定
  SkFont font;
  font.setTypeface(typeface); // フォントを設定
  font.setEdging(SkFont::Edging::kAntiAlias);
  font.setSize(50.f * 72 / 96); // テキストのサイズ。setSizeがポイントを受け取るのでピクセルから変換

  //////////////////////////////////////////////////
  // テキストの設定

  SkString text(u8"日本語表示");  // 描画するテキスト
  SkScalar x = 0.0f;             // テキストの位置(横)を設定
  SkFontMetrics metrics;
  font.getMetrics(&metrics);
  SkScalar y = -metrics.fAscent; // テキストの位置(高さ)を設定

  //////////////////////////////////////////////////
  // 画像作成
  SkBitmap bmp;
  bmp.allocN32Pixels(400, 300);
  bmp.eraseColor(SK_ColorGRAY);

  //////////////////////////////////////////////////
  // テキストの描画の設定
  SkPaint paint;
  paint.setColor(SK_ColorBLACK); // テキストの色
  paint.setAntiAlias(true);      // アンチエイリアスを有効にする

  SkCanvas* canvas = new SkCanvas(bmp);
  canvas->drawString(text, x, y, font, paint);// テキストの描画

  //////////////////////////////////////////////////
  // ファイルに保存
  save(bmp, "test.png");
}

// 作成した画像を出力
void save(const SkBitmap& bitmap, const char* filename) { // optionsの設定 SkPngEncoder::Options options; options.fZLibLevel = 9; // 圧縮レベル options.fFilterFlags = SkPngEncoder::FilterFlag::kAll; // フィルタの種類 SkImageInfo info = bitmap.info(); unsigned char* pixels = (unsigned char*)bitmap.getPixels(); // 画像データの先頭アドレス size_t rowBytes = bitmap.rowBytes(); // 1行のバイト数 // bitmapをファイル保存 SkPixmap pixmap(info, pixels, rowBytes); SkFILEWStream stream(filename); SkPngEncoder::Encode(&stream, pixmap, options); }

コメントを残す

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

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


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