FreeTypeを使う 新しいページはコチラ
提供: yonewiki
(→概要) |
(→サンプル1.Qt ConsoleApplicationでテキスト出力) |
||
| 135行: | 135行: | ||
| + | <Syntaxhighlight2 lang="cpp" line=1> | ||
| + | #include <QtCore/QCoreApplication> | ||
| + | #include <QString> | ||
| + | #include <QFile> | ||
| + | #include <QTextStream> | ||
| + | #include <QImage> | ||
| + | #include <QColor> | ||
| + | #include <QSize> | ||
| + | |||
| + | #include <ft2build.h> | ||
| + | #include FT_FREETYPE_H | ||
| + | |||
| + | static unsigned int text[] = { | ||
| + | 0x00003042, 0x00003044, 0x00003046, 0x00003048, //あ、い、う、え | ||
| + | 0x0000304a, 0x0000304b, 0x0000304d, 0x0000304f, //お、か、き、く | ||
| + | 0x00003051, 0x00003053, 0x00003055, 0x00003057, //け、こ、さ、し | ||
| + | 0x00003059, 0x0000305b, 0x0000305d, 0x0000305f, //す、せ、そ、た | ||
| + | 0x00003061, 0x00003064, 0x00003066, 0x00003068, //ち、つ、て、と | ||
| + | 0x0000000a, //改行 | ||
| + | 0x00000061, 0x00000062, 0x00000063, 0x00000064, //a、b、c、d | ||
| + | 0x00000065, 0x00000066, 0x00000067, 0x00000068, //e、f、g、h | ||
| + | 0x00000069, 0x0000006a, 0x0000006b, 0x0000006c, //i、j、k、l | ||
| + | 0x0000006d, 0x0000006e, 0x0000006f, 0x00000070, //m、n、o、p | ||
| + | 0x00000071, 0x00000072, 0x00000073, 0x00000074, //q、r、s、t | ||
| + | 0x00000075, 0x00000076, 0x00000077, 0x00000078, //u、v、w、x | ||
| + | 0x00000079, 0x0000007a, //y, z | ||
| + | 0x00000061, 0x00000062, 0x00000063, 0x00000064, //a、b、c、d | ||
| + | 0x00000065, 0x00000066, 0x00000067, 0x00000068, //e、f、g、h | ||
| + | 0x00000069, 0x0000006a, 0x0000006b, 0x0000006c, //i、j、k、l | ||
| + | 0x0000006d, 0x0000006e, 0x0000006f, 0x00000070, //m、n、 | ||
| + | 0x0000000a, //改行 | ||
| + | }; | ||
| + | #define LEN (sizeof text / sizeof text[0]) | ||
| + | |||
| + | #define WIDTH 1024 | ||
| + | #define HEIGHT 256 | ||
| + | #define LEFT 16 | ||
| + | #define TOP 32 | ||
| + | |||
| + | static unsigned char canvas[HEIGHT][WIDTH]; | ||
| + | |||
| + | static void draw(FT_Bitmap* bitmap, int x, int y) { | ||
| + | for (int j = 0; j < bitmap->rows; j++) { | ||
| + | for (int i = 0; i < bitmap->width; i++) { | ||
| + | unsigned char c = bitmap->buffer[j * bitmap->pitch + i]; | ||
| + | if (c) { | ||
| + | if (y + j >= 0 && y + j < HEIGHT) { | ||
| + | if (x + i >= 0 && x + i < WIDTH) { | ||
| + | canvas[y + j][x + i] = c; | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | |||
| + | int main(int argc, char* argv[]) | ||
| + | { | ||
| + | QCoreApplication a(argc, argv); | ||
| + | |||
| + | QString QString_FileName = "C:/FreeTypeStep01Test.txt"; | ||
| + | QString QString_ImageFileName = "C:/FreeTypeStep01Test.bmp"; | ||
| + | QFile QFile_Text(QString_FileName); | ||
| + | |||
| + | QString QString_ImageRowMonoBuffer = ""; | ||
| + | |||
| + | QSize QSize_xy(WIDTH, HEIGHT); | ||
| + | QImage QImage_Canvas(QSize_xy, QImage::Format_ARGB32_Premultiplied);//空イメージ | ||
| + | |||
| + | FT_Library library; | ||
| + | int error; | ||
| + | |||
| + | error = FT_Init_FreeType(&library); | ||
| + | |||
| + | if (error) { | ||
| + | fprintf(stderr, qPrintable("ft init error\n")); | ||
| + | exit(1); | ||
| + | } | ||
| + | |||
| + | |||
| + | FT_Face face; | ||
| + | error = FT_New_Face(library, qPrintable("C:\\Windows\\Fonts\\KozGoPr6N-Medium.otf"), 0, &face); | ||
| + | if (error) { | ||
| + | fprintf(stderr, qPrintable("new face error\n")); | ||
| + | exit(1); | ||
| + | } | ||
| + | |||
| + | error = FT_Set_Char_Size(face, 0, 8 * 64, 300, 300); | ||
| + | if (error) { | ||
| + | fprintf(stderr, qPrintable("set size error\n")); | ||
| + | exit(1); | ||
| + | } | ||
| + | |||
| + | #define LEFT64(x) ((x) << 6) // 1/64が1の 32 bit 26.6 ニィロク ロク固定小数。 | ||
| + | #define RIGHT64(x) ((x) >> 6) | ||
| + | |||
| + | FT_Vector pen; | ||
| + | pen.x = LEFT64(LEFT); | ||
| + | pen.y = RIGHT64(TOP); | ||
| + | unsigned int idces[LEN]; | ||
| + | for (int i = 0; i < LEN; i++) { | ||
| + | if (text[i] == '\n') { | ||
| + | fprintf(stderr, qPrintable("%ld\n"), pen.x); | ||
| + | pen.x = LEFT64(LEFT); | ||
| + | pen.y += LEFT64(48); | ||
| + | continue; | ||
| + | } | ||
| + | idces[i] = FT_Get_Char_Index(face, text[i]); | ||
| + | |||
| + | error = FT_Load_Glyph(face, idces[i], FT_LOAD_DEFAULT); | ||
| + | if (error) { | ||
| + | fprintf(stderr, qPrintable("no glyph error/\n")); | ||
| + | exit(1); | ||
| + | } | ||
| + | |||
| + | error = FT_Render_Glyph(face->glyph, FT_RENDER_MODE_NORMAL); | ||
| + | if (error) { | ||
| + | fprintf(stderr, qPrintable("glyph render error\n")); | ||
| + | exit(1); | ||
| + | } | ||
| + | |||
| + | draw(&face->glyph->bitmap, | ||
| + | RIGHT64(pen.x) + face->glyph->bitmap_left, | ||
| + | RIGHT64(pen.y) + face->glyph->bitmap_top); | ||
| + | |||
| + | pen.x += face->glyph->advance.x; | ||
| + | } | ||
| + | fprintf(stderr, qPrintable("\n")); | ||
| + | |||
| + | for (int y = 0; y < HEIGHT; y++) { | ||
| + | for (int x = 0; x < WIDTH; x++) { | ||
| + | QImage_Canvas.setPixel(x, y, qRgb(canvas[y][x], canvas[y][x], canvas[y][x])); | ||
| + | } | ||
| + | } | ||
| + | QImage_Canvas.save(QString_ImageFileName, "BMP"); | ||
| + | printf(qPrintable("P3\n%d %d\n%d\n"), WIDTH, HEIGHT, 255); | ||
| + | |||
| + | if (QFile_Text.open(QIODevice::WriteOnly)) { | ||
| + | QTextStream out(&QFile_Text); | ||
| + | for (int y = 0; y < HEIGHT; y++) { | ||
| + | for (int x = 0; x < WIDTH; x++) { | ||
| + | if (canvas[y][x]) { | ||
| + | QString_ImageRowMonoBuffer = QString_ImageRowMonoBuffer + " 1"; | ||
| + | //printf(qPrintable("%2d"), 1); | ||
| + | } | ||
| + | else { | ||
| + | QString_ImageRowMonoBuffer = QString_ImageRowMonoBuffer + " 0"; | ||
| + | //printf(qPrintable("%2d"), 0); | ||
| + | } | ||
| + | } | ||
| + | QString_ImageRowMonoBuffer = QString_ImageRowMonoBuffer + "\n"; | ||
| + | //printf(qPrintable("\n")); | ||
| + | |||
| + | out << QString_ImageRowMonoBuffer; | ||
| + | |||
| + | QString_ImageRowMonoBuffer = ""; | ||
| + | |||
| + | } | ||
| + | QFile_Text.close(); | ||
| + | } | ||
| + | else { | ||
| + | QString QString_Error(qPrintable("No Open or Create Error\n")); | ||
| + | QString_Error = QString_Error + QFile_Text.errorString(); | ||
| + | fprintf(stderr, qPrintable(QString_Error)); | ||
| + | } | ||
| + | |||
| + | return a.exec(); | ||
| + | } | ||
| + | </Syntaxhighlight2> | ||
[[フォント TrueType 構造解析]]に戻る。 | [[フォント TrueType 構造解析]]に戻る。 | ||