summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDr.Smile <vabnick@gmail.com>2021-09-26 05:48:01 +0300
committerDr.Smile <vabnick@gmail.com>2021-10-05 21:21:54 +0300
commitd9b5e327c5e8d26c9dde2ba9bc401c9f66883726 (patch)
treef87f38e0be647e617b81844bef73288ea7296630
parent3d7eb7ddbbba7243e72551a00cac6e073eb5822b (diff)
downloadlibass-d9b5e327c5e8d26c9dde2ba9bc401c9f66883726.tar.bz2
libass-d9b5e327c5e8d26c9dde2ba9bc401c9f66883726.tar.xz
renderer: eliminate FT_Glyph
-rw-r--r--libass/ass_font.c45
-rw-r--r--libass/ass_font.h8
-rw-r--r--libass/ass_render.c21
3 files changed, 29 insertions, 45 deletions
diff --git a/libass/ass_font.c b/libass/ass_font.c
index 36c7eaa..79ab22b 100644
--- a/libass/ass_font.c
+++ b/libass/ass_font.c
@@ -461,15 +461,10 @@ int ass_font_get_index(ASS_FontSelector *fontsel, ASS_Font *font,
* \brief Get a glyph
* \param ch character code
**/
-FT_Glyph ass_font_get_glyph(ASS_Font *font, int face_index, int index,
- ASS_Hinting hinting)
+bool ass_font_get_glyph(ASS_Font *font, int face_index, int index,
+ ASS_Hinting hinting)
{
- int error;
- FT_Glyph glyph;
- FT_Face face = font->faces[face_index];
- int flags = 0;
-
- flags = FT_LOAD_NO_BITMAP | FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH
+ FT_Int32 flags = FT_LOAD_NO_BITMAP | FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH
| FT_LOAD_IGNORE_TRANSFORM;
switch (hinting) {
case ASS_HINTING_NONE:
@@ -485,28 +480,18 @@ FT_Glyph ass_font_get_glyph(ASS_Font *font, int face_index, int index,
break;
}
- error = FT_Load_Glyph(face, index, flags);
+ FT_Face face = font->faces[face_index];
+ FT_Error error = FT_Load_Glyph(face, index, flags);
if (error) {
ass_msg(font->library, MSGL_WARN, "Error loading glyph, index %d",
index);
- return 0;
+ return false;
}
- if (!(face->style_flags & FT_STYLE_FLAG_ITALIC) &&
- (font->desc.italic > 55)) {
+ if (!(face->style_flags & FT_STYLE_FLAG_ITALIC) && (font->desc.italic > 55))
FT_GlyphSlot_Oblique(face->glyph);
- }
-
- if (font->desc.bold > ass_face_get_weight(face) + 150) {
+ if (font->desc.bold > ass_face_get_weight(face) + 150)
ass_glyph_embolden(face->glyph);
- }
- error = FT_Get_Glyph(face->glyph, &glyph);
- if (error) {
- ass_msg(font->library, MSGL_WARN, "Error loading glyph, index %d",
- index);
- return 0;
- }
-
- return glyph;
+ return true;
}
/**
@@ -528,11 +513,13 @@ void ass_font_clear(ASS_Font *font)
* \brief Convert glyph into ASS_Outline according to decoration flags
**/
bool ass_get_glyph_outline(ASS_Outline *outline, int32_t *advance,
- FT_Face face, FT_Glyph glyph, unsigned flags)
+ FT_Face face, unsigned flags)
{
int32_t y_scale = face->size->metrics.y_scale;
- int32_t adv = flags & DECO_ROTATE ? face->glyph->linearVertAdvance : glyph->advance.x;
- *advance = adv = d16_to_d6(adv);
+ int32_t adv = face->glyph->advance.x;
+ if (flags & DECO_ROTATE)
+ adv = d16_to_d6(face->glyph->linearVertAdvance);
+ *advance = adv;
int n_lines = 0;
int32_t line_y[2][2];
@@ -563,8 +550,8 @@ bool ass_get_glyph_outline(ASS_Outline *outline, int32_t *advance,
}
}
- assert(glyph->format == FT_GLYPH_FORMAT_OUTLINE);
- FT_Outline *source = &((FT_OutlineGlyph) glyph)->outline;
+ assert(face->glyph->format == FT_GLYPH_FORMAT_OUTLINE);
+ FT_Outline *source = &face->glyph->outline;
if (!source->n_points && !n_lines) {
outline_clear(outline);
return true;
diff --git a/libass/ass_font.h b/libass/ass_font.h
index 783d6f9..02d4508 100644
--- a/libass/ass_font.h
+++ b/libass/ass_font.h
@@ -21,7 +21,7 @@
#include <stdint.h>
#include <ft2build.h>
-#include FT_GLYPH_H
+#include FT_FREETYPE_H
typedef struct ass_font ASS_Font;
@@ -59,12 +59,12 @@ void ass_font_get_asc_desc(ASS_Font *font, int face_index,
int ass_font_get_index(ASS_FontSelector *fontsel, ASS_Font *font,
uint32_t symbol, int *face_index, int *glyph_index);
uint32_t ass_font_index_magic(FT_Face face, uint32_t symbol);
-FT_Glyph ass_font_get_glyph(ASS_Font *font, int face_index, int index,
- ASS_Hinting hinting);
+bool ass_font_get_glyph(ASS_Font *font, int face_index, int index,
+ ASS_Hinting hinting);
void ass_font_clear(ASS_Font *font);
bool ass_get_glyph_outline(ASS_Outline *outline, int32_t *advance,
- FT_Face face, FT_Glyph glyph, unsigned flags);
+ FT_Face face, unsigned flags);
FT_Face ass_face_open(ASS_Library *lib, FT_Library ftlib, const char *path,
const char *postscript_name, int index);
diff --git a/libass/ass_render.c b/libass/ass_render.c
index 5d78106..770bf95 100644
--- a/libass/ass_render.c
+++ b/libass/ass_render.c
@@ -1164,18 +1164,15 @@ size_t ass_outline_construct(void *key, void *value, void *priv)
{
GlyphHashKey *k = &outline_key->u.glyph;
ass_face_set_size(k->font->faces[k->face_index], k->size);
- FT_Glyph glyph =
- ass_font_get_glyph(k->font, k->face_index, k->glyph_index,
- render_priv->settings.hinting);
- if (glyph != NULL) {
- if (!ass_get_glyph_outline(&v->outline[0], &v->advance,
- k->font->faces[k->face_index],
- glyph, k->flags))
- return 1;
- FT_Done_Glyph(glyph);
- ass_font_get_asc_desc(k->font, k->face_index,
- &v->asc, &v->desc);
- }
+ if (!ass_font_get_glyph(k->font, k->face_index, k->glyph_index,
+ render_priv->settings.hinting))
+ return 1;
+ if (!ass_get_glyph_outline(&v->outline[0], &v->advance,
+ k->font->faces[k->face_index],
+ k->flags))
+ return 1;
+ ass_font_get_asc_desc(k->font, k->face_index,
+ &v->asc, &v->desc);
break;
}
case OUTLINE_DRAWING: