Subscribed unsubscribe Subscribe Subscribe

.ttfファイルに格納されたフォントのファミリ名とスタイルを取得するプログラム

って探せばありそうなもんだけど無線LANの調子が悪くググれなくて見つけられなかったので仕方なくCで書いてみた。

もったいないので張り付けておこう。

#include <stdio.h>
#include <ft2build.h>
#include FT_FREETYPE_H

#undef __FTERRORS_H__
#define FT_ERRORDEF(e, v, s) { e, s },
#define FT_ERROR_START_LIST struct { \
    FT_Error code; \
    const char *str; \
} ft_errors[] = {
#define FT_ERROR_END_LIST { FT_ERR_CAT(FT_ERR_PREFIX, Max), NULL } };
#include FT_ERRORS_H
#undef FT_ERRORDEF
#undef FT_ERROR_START_LIST
#undef FT_ERROR_END_LIST

static const char *ft_strerror(FT_Error err)
{
    size_t i;
    for (i = 0; ft_errors[i].code != FT_Err_Max; ++i) {
        if (ft_errors[i].code == err) {
            return ft_errors[i].str;
        }
    }
    return NULL;
}

static int display_face_info(FT_Library ft_ctx, const char *path)
{
    int err = 0;
    FT_Face face;
    if ((err = FT_New_Face(ft_ctx, path, 0, &face))) {
        return err;
    }

    printf("%s %s\n", face->family_name, face->style_name);

out:
    FT_Done_Face(face);
    return err;
}

int main(int argc, char **argv)
{
    int err = 0;
    FT_Library ft_ctx;
    FT_Error ft_err;

    if ((ft_err = FT_Init_FreeType(&ft_ctx))) {
        fprintf(stderr, "%s: failed to initialize the freetype library (%s)\n",
                argv[0], ft_strerror(ft_err));
        return 1;
    }

    if (argc <= 1) {
        fprintf(stderr, "Usage: %s file\n", argv[0]);
        err = 255;
        goto out;
    }

    if ((ft_err = display_face_info(ft_ctx, argv[1]))) {
        fprintf(stderr, "%s: %s\n", argv[0], ft_strerror(ft_err));
        err = 1;
        goto out;
    }

out:
    FT_Done_FreeType(ft_ctx);
    return err;
}