スポンサーリンク

Skiaでフォント使用(2)ファイルからフォント取得

前回はフォントの格納されたディレクトリから一括読み込みをした。

今回はフォントファイルからフォントを読み込む。

まずSkDataとしてフォントファイルを読み込んでから、SkDataの配列として管理し、SkFontMgr_New_Custom_Dataに与えるとフォントとして解釈してくれる。

今回使用したのは一つのフォントファイルだけだが、一つのフォントファイルの中には複数のフォントが入っている場合があるのでループして取り出している。

#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_data.h" // フォントをファイルから読み込むために必要
#include "include/core/SkFontMetrics.h"
/////////////////////////////////////


void save(const SkBitmap& bitmap, const char* filename);
 
// テキスト描画のテスト
void TextTest() {
    
    std::vector<sk_sp<SkData>> fontDataList;

    // フォントファイルを読み込み
    sk_sp<SkData> fontdata = SkData::MakeFromFileName("C:\\test\\msmincho.ttc");

// フォントデータをリストに追加 fontDataList.push_back(fontdata); // フォントデータ一覧からフォントマネージャ作成 auto fontMgr = SkFontMgr_New_Custom_Data(SkSpan<sk_sp<SkData>>(fontDataList.data(), fontDataList.size())); // 画像作成 SkBitmap bmp; bmp.allocN32Pixels(600, 300); bmp.eraseColor(SK_ColorGRAY); // テキストの描画 SkPaint paint; paint.setColor(SK_ColorBLACK); // テキストの色 paint.setAntiAlias(true); // アンチエイリアスを有効にする SkCanvas* canvas = new SkCanvas(bmp); // フォントの設定 SkFont font; font.setEdging(SkFont::Edging::kAntiAlias); // エッジングの設定 font.setSize(50.f * 72 / 96); // テキストのサイズ。setSizeがポイントを受け取るのでピクセルから変換 SkScalar x = 0.0f; // テキストの位置(横)を設定 SkScalar y = 0.0f; // テキストの位置(縦)を設定 SkFontMetrics metrics; int fc = fontMgr->countFamilies(); // フォントマネージャ内のフォントファミリの個数
for (int i = 0; i < fc; i++) { SkString familyName; fontMgr->getFamilyName(i, &familyName);// フォントファミリの名前を取得 printf("FamilyName: %s\n", familyName.c_str());
// フォント名からフォントフェイス取得 sk_sp<SkTypeface> typeface = fontMgr->matchFamilyStyle(familyName.c_str(), SkFontStyle::Normal());
font.setTypeface(typeface); // フォントの設定 font.getMetrics(&metrics); y -= metrics.fAscent;// テキストの位置(高さ)を設定 SkString text(u8"FamilyName "); // 描画するテキスト text += familyName.c_str(); text += u8"日本語"; 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: