[util] Implement ppem/ptem on hb-{shape,view} (#811)

This commit is contained in:
Ebrahim Byagowi 2018-02-23 02:54:12 +03:30 committed by GitHub
parent a6bd6bcee0
commit 4f6f7c3b22
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 34 additions and 5 deletions

View File

@ -481,6 +481,25 @@ parse_font_size (const char *name G_GNUC_UNUSED,
return false;
}
}
static gboolean
parse_font_ppem (const char *name G_GNUC_UNUSED,
const char *arg,
gpointer data,
GError **error G_GNUC_UNUSED)
{
font_options_t *font_opts = (font_options_t *) data;
switch (sscanf (arg, "%d%*[ ,]%d", &font_opts->x_ppem, &font_opts->y_ppem)) {
case 1: font_opts->y_ppem = font_opts->x_ppem;
case 2: return true;
default:
g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
"%s argument should be one or two space-separated numbers",
name);
return false;
}
}
void
font_options_t::add_options (option_parser_t *parser)
{
@ -513,12 +532,13 @@ font_options_t::add_options (option_parser_t *parser)
GOptionEntry entries[] =
{
{"font-file", 0, 0, G_OPTION_ARG_STRING, &this->font_file, "Set font file-name", "filename"},
{"face-index", 0, 0, G_OPTION_ARG_INT, &this->face_index, "Set face index (default: 0)", "index"},
{"font-file", 0, 0, G_OPTION_ARG_STRING, &this->font_file, "Set font file-name", "filename"},
{"face-index", 0, 0, G_OPTION_ARG_INT, &this->face_index, "Set face index (default: 0)", "index"},
{"font-size", 0, default_font_size ? 0 : G_OPTION_FLAG_HIDDEN,
G_OPTION_ARG_CALLBACK, (gpointer) &parse_font_size, font_size_text, "1/2 numbers or 'upem'"},
/* TODO Add font-ppem / font-ptem. */
{"font-funcs", 0, 0, G_OPTION_ARG_STRING, &this->font_funcs, text, "impl"},
G_OPTION_ARG_CALLBACK, (gpointer) &parse_font_size, font_size_text, "1/2 integers or 'upem'"},
{"font-ppem", 0, 0, G_OPTION_ARG_CALLBACK, (gpointer) &parse_font_ppem, "Set x,y pixels per EM (default: 0; disabled)", "1/2 integers"},
{"font-ptem", 0, 0, G_OPTION_ARG_DOUBLE, &this->ptem, "Set font point-size (default: 0; disabled)", "point-size"},
{"font-funcs", 0, 0, G_OPTION_ARG_STRING, &this->font_funcs, text, "impl"},
{nullptr}
};
parser->add_group (entries,
@ -691,6 +711,9 @@ font_options_t::get_font (void) const
if (font_size_y == FONT_SIZE_UPEM)
font_size_y = hb_face_get_upem (face);
hb_font_set_ppem (font, x_ppem, y_ppem);
hb_font_set_ptem (font, ptem);
int scale_x = (int) scalbnf (font_size_x, subpixel_bits);
int scale_y = (int) scalbnf (font_size_y, subpixel_bits);
hb_font_set_scale (font, scale_x, scale_y);

View File

@ -452,6 +452,9 @@ struct font_options_t : option_group_t
variations = nullptr;
num_variations = 0;
default_font_size = default_font_size_;
x_ppem = 0;
y_ppem = 0;
ptem = .0;
subpixel_bits = subpixel_bits_;
font_file = nullptr;
face_index = 0;
@ -478,6 +481,9 @@ struct font_options_t : option_group_t
hb_variation_t *variations;
unsigned int num_variations;
int default_font_size;
int x_ppem;
int y_ppem;
double ptem;
unsigned int subpixel_bits;
mutable double font_size_x;
mutable double font_size_y;