Skip to content

Commit dfb6cc4

Browse files
committed
libass: remove fribidi dependency
1 parent 7b0cb10 commit dfb6cc4

File tree

4 files changed

+201
-5
lines changed

4 files changed

+201
-5
lines changed

pkg/libass/config.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
/* #undef CONFIG_DIRECTWRITE */
44
/* #undef CONFIG_FONTCONFIG */
55
#define CONFIG_FREETYPE 1
6-
#define CONFIG_FRIBIDI 1
6+
/* #undef CONFIG_FRIBIDI */
77
/* #undef CONFIG_HARFBUZZ */
88
#define CONFIG_ICONV 1
99
/* #undef CONFIG_LARGE_TILES */

pkg/libass/gen.lua

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
cflags{
22
'-I $dir',
33
'-isystem $builddir/pkg/freetype/include',
4-
'-isystem $builddir/pkg/fribidi/include',
54
}
65
nasmflags{
76
'-D ARCH_X86_64=1',
@@ -16,7 +15,6 @@ nasmflags{
1615
pkg.hdrs = copy('$outdir/include/ass', '$srcdir/libass', {'ass.h', 'ass_types.h'})
1716
pkg.deps = {
1817
'pkg/freetype/headers',
19-
'pkg/fribidi/headers',
2018
'$outdir/PIC.asm',
2119
}
2220

@@ -39,7 +37,6 @@ lib('libass.a', [[
3937
)
4038
)
4139
$builddir/pkg/freetype/libfreetype.a.d
42-
$builddir/pkg/fribidi/libfribidi.a
4340
]])
4441

4542
fetch 'git'
Lines changed: 199 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,199 @@
1+
From 4b793f41cce613bdf458477846e592ce1db4a5b2 Mon Sep 17 00:00:00 2001
2+
From: hovercats <hovercatswithlasereyes@protonmail.com>
3+
Date: Wed, 30 Apr 2025 13:15:55 +0200
4+
Subject: [PATCH] ass_shaper: remove fribidi dependency
5+
6+
---
7+
libass/ass_shaper.c | 107 ++------------------------------------------
8+
libass/ass_shaper.h | 3 +-
9+
2 files changed, 6 insertions(+), 104 deletions(-)
10+
11+
diff --git a/libass/ass_shaper.c b/libass/ass_shaper.c
12+
index 657885b..d8c77ff 100644
13+
--- a/libass/ass_shaper.c
14+
+++ b/libass/ass_shaper.c
15+
@@ -44,9 +44,6 @@ struct ass_shaper {
16+
17+
// FriBidi log2vis
18+
int n_glyphs;
19+
- FriBidiChar *event_text;
20+
- FriBidiCharType *ctypes;
21+
- FriBidiLevel *emblevels;
22+
FriBidiStrIndex *cmap;
23+
FriBidiParType base_direction;
24+
25+
@@ -80,8 +77,7 @@ struct ass_shaper_font_data {
26+
*/
27+
void ass_shaper_info(ASS_Library *lib)
28+
{
29+
- ass_msg(lib, MSGL_INFO, "Shaper: FriBidi "
30+
- FRIBIDI_VERSION " (SIMPLE)"
31+
+ ass_msg(lib, MSGL_INFO, "Shaper:"
32+
#ifdef CONFIG_HARFBUZZ
33+
" HarfBuzz-ng %s (COMPLEX)", hb_version_string()
34+
#endif
35+
@@ -95,10 +91,7 @@ void ass_shaper_info(ASS_Library *lib)
36+
static bool check_allocations(ASS_Shaper *shaper, size_t new_size)
37+
{
38+
if (new_size > shaper->n_glyphs) {
39+
- if (!ASS_REALLOC_ARRAY(shaper->event_text, new_size) ||
40+
- !ASS_REALLOC_ARRAY(shaper->ctypes, new_size) ||
41+
- !ASS_REALLOC_ARRAY(shaper->emblevels, new_size) ||
42+
- !ASS_REALLOC_ARRAY(shaper->cmap, new_size))
43+
+ if (!ASS_REALLOC_ARRAY(shaper->cmap, new_size))
44+
return false;
45+
shaper->n_glyphs = new_size;
46+
}
47+
@@ -114,9 +107,6 @@ void ass_shaper_free(ASS_Shaper *shaper)
48+
ass_cache_done(shaper->metrics_cache);
49+
free(shaper->features);
50+
#endif
51+
- free(shaper->event_text);
52+
- free(shaper->ctypes);
53+
- free(shaper->emblevels);
54+
free(shaper->cmap);
55+
free(shaper);
56+
}
57+
@@ -688,33 +678,6 @@ void ass_shaper_determine_script(ASS_Shaper *shaper, GlyphInfo *glyphs,
58+
}
59+
#endif
60+
61+
-/**
62+
- * \brief Shape event text with FriBidi. Does mirroring and simple
63+
- * Arabic shaping.
64+
- * \param len number of clusters
65+
- */
66+
-static void shape_fribidi(ASS_Shaper *shaper, GlyphInfo *glyphs, size_t len)
67+
-{
68+
- int i;
69+
- FriBidiJoiningType *joins = calloc(sizeof(*joins), len);
70+
-
71+
- // shape on codepoint level
72+
- fribidi_get_joining_types(shaper->event_text, len, joins);
73+
- fribidi_join_arabic(shaper->ctypes, len, shaper->emblevels, joins);
74+
- fribidi_shape(FRIBIDI_FLAGS_DEFAULT | FRIBIDI_FLAGS_ARABIC,
75+
- shaper->emblevels, len, joins, shaper->event_text);
76+
-
77+
- // update indexes
78+
- for (i = 0; i < len; i++) {
79+
- GlyphInfo *info = glyphs + i;
80+
- FT_Face face = info->font->faces[info->face_index];
81+
- info->symbol = shaper->event_text[i];
82+
- info->glyph_index = FT_Get_Char_Index(face, ass_font_index_magic(face, shaper->event_text[i]));
83+
- }
84+
-
85+
- free(joins);
86+
-}
87+
-
88+
/**
89+
* \brief Toggle kerning for HarfBuzz shaping.
90+
* \param shaper shaper instance
91+
@@ -852,50 +815,7 @@ static void ass_shaper_skip_characters(TextInfo *text_info)
92+
*/
93+
int ass_shaper_shape(ASS_Shaper *shaper, TextInfo *text_info)
94+
{
95+
- int i, ret, last_break;
96+
- FriBidiParType dir;
97+
- GlyphInfo *glyphs = text_info->glyphs;
98+
-
99+
- if (!check_allocations(shaper, text_info->length))
100+
- return -1;
101+
-
102+
- // Get bidi character types and embedding levels
103+
- last_break = 0;
104+
- for (i = 0; i < text_info->length; i++) {
105+
- shaper->event_text[i] = glyphs[i].symbol;
106+
- // embedding levels should be calculated paragraph by paragraph
107+
- if (glyphs[i].symbol == '\n' || i == text_info->length - 1) {
108+
- dir = shaper->base_direction;
109+
- fribidi_get_bidi_types(shaper->event_text + last_break,
110+
- i - last_break + 1, shaper->ctypes + last_break);
111+
- ret = fribidi_get_par_embedding_levels(shaper->ctypes + last_break,
112+
- i - last_break + 1, &dir, shaper->emblevels + last_break);
113+
- if (ret == 0)
114+
- return -1;
115+
- last_break = i + 1;
116+
- }
117+
- }
118+
-
119+
- // add embedding levels to shape runs for final runs
120+
- for (i = 0; i < text_info->length; i++) {
121+
- glyphs[i].shape_run_id += shaper->emblevels[i];
122+
- }
123+
-
124+
-#ifdef CONFIG_HARFBUZZ
125+
- switch (shaper->shaping_level) {
126+
- case ASS_SHAPING_SIMPLE:
127+
- shape_fribidi(shaper, glyphs, text_info->length);
128+
- ass_shaper_skip_characters(text_info);
129+
- break;
130+
- case ASS_SHAPING_COMPLEX:
131+
- shape_harfbuzz(shaper, glyphs, text_info->length);
132+
- break;
133+
- }
134+
-#else
135+
- shape_fribidi(shaper, glyphs, text_info->length);
136+
- ass_shaper_skip_characters(text_info);
137+
-#endif
138+
-
139+
+ check_allocations(shaper, text_info->length);
140+
return 0;
141+
}
142+
143+
@@ -909,7 +829,6 @@ ASS_Shaper *ass_shaper_new(size_t prealloc)
144+
if (!shaper)
145+
return NULL;
146+
147+
- shaper->base_direction = FRIBIDI_PAR_ON;
148+
if (!check_allocations(shaper, prealloc))
149+
goto error;
150+
151+
@@ -962,19 +881,6 @@ FriBidiStrIndex *ass_shaper_reorder(ASS_Shaper *shaper, TextInfo *text_info)
152+
for (i = 0; i < text_info->length; i++)
153+
shaper->cmap[i] = i;
154+
155+
- // Create reorder map line-by-line
156+
- for (i = 0; i < text_info->n_lines; i++) {
157+
- LineInfo *line = text_info->lines + i;
158+
- FriBidiParType dir = FRIBIDI_PAR_ON;
159+
-
160+
- ret = fribidi_reorder_line(0,
161+
- shaper->ctypes + line->offset, line->len, 0, dir,
162+
- shaper->emblevels + line->offset, NULL,
163+
- shaper->cmap + line->offset);
164+
- if (ret == 0)
165+
- return NULL;
166+
- }
167+
-
168+
return shaper->cmap;
169+
}
170+
171+
@@ -987,10 +893,5 @@ FriBidiStrIndex *ass_shaper_reorder(ASS_Shaper *shaper, TextInfo *text_info)
172+
*/
173+
FriBidiParType resolve_base_direction(int enc)
174+
{
175+
- switch (enc) {
176+
- case -1:
177+
- return FRIBIDI_PAR_ON;
178+
- default:
179+
- return FRIBIDI_PAR_LTR;
180+
- }
181+
+ return 0;
182+
}
183+
diff --git a/libass/ass_shaper.h b/libass/ass_shaper.h
184+
index f6404fe..69a7ea9 100644
185+
--- a/libass/ass_shaper.h
186+
+++ b/libass/ass_shaper.h
187+
@@ -21,7 +21,8 @@
188+
189+
typedef struct ass_shaper ASS_Shaper;
190+
191+
-#include <fribidi.h>
192+
+typedef int FriBidiParType;
193+
+typedef int FriBidiStrIndex;
194+
#include "ass_render.h"
195+
196+
void ass_shaper_info(ASS_Library *lib);
197+
--
198+
2.49.0
199+

pkg/libass/ver

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
0.14.0 r1
1+
0.14.0 r2

0 commit comments

Comments
 (0)