趣味で作ってるロボット用ソフトウェア
 All Classes Files Functions Enumerations Enumerator Friends Pages
文字列の表示

文字列を描画するためのサーフェスです。
描画する文字は hrk::Font によって決定することができ、任意の True Type Font を描画できます。

文字列の作成には SDL_ttf ライブラリを用いており、そこで生成したサーフェスを OpenGL のテクスチャに変換して利用しています。

lib/gui/Text_surface.cpp より抜粋

SDL_ttf の TTF_RenderUTF8_Shaded() 関数を用いて文字列の SDL_Surface を作成し、それを hrk::Sdl_gl_texture クラスに渡して OpenGL のテクスチャ形式に変換しています。

Sdl_gl_texture* create_text_texture(const Font& font,
const string& text,
bool length_calculate_only = false,
int* width = NULL,
int* height = NULL)
{
TTF_Font* font_resource = font.resource();
if (! font_resource) {
return NULL;
}
if (length_calculate_only) {
TTF_SizeUTF8(font_resource, text.c_str(), width, height);
return NULL;
}
const Color& fore_color = font.foreground_color();
SDL_Color fore;
fore.r = static_cast<unsigned char>(0xff * fore_color.red());
fore.g = static_cast<unsigned char>(0xff * fore_color.green());
fore.b = static_cast<unsigned char>(0xff * fore_color.blue());
const Color& back_color = font.background_color();
SDL_Color back;
back.r = static_cast<unsigned char>(0xff * back_color.red());
back.g = static_cast<unsigned char>(0xff * back_color.green());
back.b = static_cast<unsigned char>(0xff * back_color.blue());
SDL_Surface* surface =
TTF_RenderUTF8_Shaded(font_resource, text.c_str(), fore, back);
return new Sdl_gl_texture(surface, font.transparent());
}

hrk::Text_surface 用のサンプルでは、英語と日本語の文字列を描画しています。
このサンプルの描画では "IPA P ゴシック" を利用しています。

lib/gui/example/text_surface_example.cpp

#include <iostream>
#include <SDL.h>
#include "Main_window.h"
#include "View.h"
#include "Scene.h"
#include "Layer.h"
#include "Label.h"
#include "delay.h"
#include "Font.h"
#include "Color.h"
#include "Text_surface.h"
using namespace hrk;
using namespace std;
int main(int argc, char *argv[])
{
const char* font_file = (argc >= 2) ? argv[1] : "";
Main_window main_window;
main_window.show(SizeF(640, 480));
View view(main_window);
Scene* scene = view.front();
Layer* layer = scene->front();
Font font(font_file);
if (!font.is_valid()) {
cout << "Font::open(): " << font.what() << endl;
return 1;
}
font.set_pixel_size(20);
Text_surface hello_text(font, "Hellow, world.");
font.set_foreground_color(Color(0.5, 0.5, 1.0));
Text_surface jp_text(font, "こんにちは.");
Label hello_label(&hello_text);
Label jp_label(&jp_text);
layer->push_front(&hello_label);
layer->push_front(&jp_label);
jp_label.set_position(PointF(0, hello_label.size().height()));
view.redraw();
view.redraw();
delay_sec(1.5);
return 0;
}
text_surface_example_image.png
実行結果