Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion pkg/libass/config.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
/* #undef CONFIG_DIRECTWRITE */
/* #undef CONFIG_FONTCONFIG */
#define CONFIG_FREETYPE 1
#define CONFIG_FRIBIDI 1
/* #undef CONFIG_HARFBUZZ */
#define CONFIG_ICONV 1
/* #undef CONFIG_LARGE_TILES */
Expand Down
3 changes: 0 additions & 3 deletions pkg/libass/gen.lua
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
cflags{
'-I $dir',
'-isystem $builddir/pkg/freetype/include',
'-isystem $builddir/pkg/fribidi/include',
}
nasmflags{
'-D ARCH_X86_64=1',
Expand All @@ -16,7 +15,6 @@ nasmflags{
pkg.hdrs = copy('$outdir/include/ass', '$srcdir/libass', {'ass.h', 'ass_types.h'})
pkg.deps = {
'pkg/freetype/headers',
'pkg/fribidi/headers',
'$outdir/PIC.asm',
}

Expand All @@ -39,7 +37,6 @@ lib('libass.a', [[
)
)
$builddir/pkg/freetype/libfreetype.a.d
$builddir/pkg/fribidi/libfribidi.a
]])

fetch 'git'
199 changes: 199 additions & 0 deletions pkg/libass/patch/0002-ass_shaper-remove-fribidi-dependency.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,199 @@
From 4b793f41cce613bdf458477846e592ce1db4a5b2 Mon Sep 17 00:00:00 2001
From: hovercats <hovercatswithlasereyes@protonmail.com>
Date: Wed, 30 Apr 2025 13:15:55 +0200
Subject: [PATCH] ass_shaper: remove fribidi dependency

---
libass/ass_shaper.c | 107 ++------------------------------------------
libass/ass_shaper.h | 3 +-
2 files changed, 6 insertions(+), 104 deletions(-)

diff --git a/libass/ass_shaper.c b/libass/ass_shaper.c
index 657885b..d8c77ff 100644
--- a/libass/ass_shaper.c
+++ b/libass/ass_shaper.c
@@ -44,9 +44,6 @@ struct ass_shaper {

// FriBidi log2vis
int n_glyphs;
- FriBidiChar *event_text;
- FriBidiCharType *ctypes;
- FriBidiLevel *emblevels;
FriBidiStrIndex *cmap;
FriBidiParType base_direction;

@@ -80,8 +77,7 @@ struct ass_shaper_font_data {
*/
void ass_shaper_info(ASS_Library *lib)
{
- ass_msg(lib, MSGL_INFO, "Shaper: FriBidi "
- FRIBIDI_VERSION " (SIMPLE)"
+ ass_msg(lib, MSGL_INFO, "Shaper:"
#ifdef CONFIG_HARFBUZZ
" HarfBuzz-ng %s (COMPLEX)", hb_version_string()
#endif
@@ -95,10 +91,7 @@ void ass_shaper_info(ASS_Library *lib)
static bool check_allocations(ASS_Shaper *shaper, size_t new_size)
{
if (new_size > shaper->n_glyphs) {
- if (!ASS_REALLOC_ARRAY(shaper->event_text, new_size) ||
- !ASS_REALLOC_ARRAY(shaper->ctypes, new_size) ||
- !ASS_REALLOC_ARRAY(shaper->emblevels, new_size) ||
- !ASS_REALLOC_ARRAY(shaper->cmap, new_size))
+ if (!ASS_REALLOC_ARRAY(shaper->cmap, new_size))
return false;
shaper->n_glyphs = new_size;
}
@@ -114,9 +107,6 @@ void ass_shaper_free(ASS_Shaper *shaper)
ass_cache_done(shaper->metrics_cache);
free(shaper->features);
#endif
- free(shaper->event_text);
- free(shaper->ctypes);
- free(shaper->emblevels);
free(shaper->cmap);
free(shaper);
}
@@ -688,33 +678,6 @@ void ass_shaper_determine_script(ASS_Shaper *shaper, GlyphInfo *glyphs,
}
#endif

-/**
- * \brief Shape event text with FriBidi. Does mirroring and simple
- * Arabic shaping.
- * \param len number of clusters
- */
-static void shape_fribidi(ASS_Shaper *shaper, GlyphInfo *glyphs, size_t len)
-{
- int i;
- FriBidiJoiningType *joins = calloc(sizeof(*joins), len);
-
- // shape on codepoint level
- fribidi_get_joining_types(shaper->event_text, len, joins);
- fribidi_join_arabic(shaper->ctypes, len, shaper->emblevels, joins);
- fribidi_shape(FRIBIDI_FLAGS_DEFAULT | FRIBIDI_FLAGS_ARABIC,
- shaper->emblevels, len, joins, shaper->event_text);
-
- // update indexes
- for (i = 0; i < len; i++) {
- GlyphInfo *info = glyphs + i;
- FT_Face face = info->font->faces[info->face_index];
- info->symbol = shaper->event_text[i];
- info->glyph_index = FT_Get_Char_Index(face, ass_font_index_magic(face, shaper->event_text[i]));
- }
-
- free(joins);
-}
-
/**
* \brief Toggle kerning for HarfBuzz shaping.
* \param shaper shaper instance
@@ -852,50 +815,7 @@ static void ass_shaper_skip_characters(TextInfo *text_info)
*/
int ass_shaper_shape(ASS_Shaper *shaper, TextInfo *text_info)
{
- int i, ret, last_break;
- FriBidiParType dir;
- GlyphInfo *glyphs = text_info->glyphs;
-
- if (!check_allocations(shaper, text_info->length))
- return -1;
-
- // Get bidi character types and embedding levels
- last_break = 0;
- for (i = 0; i < text_info->length; i++) {
- shaper->event_text[i] = glyphs[i].symbol;
- // embedding levels should be calculated paragraph by paragraph
- if (glyphs[i].symbol == '\n' || i == text_info->length - 1) {
- dir = shaper->base_direction;
- fribidi_get_bidi_types(shaper->event_text + last_break,
- i - last_break + 1, shaper->ctypes + last_break);
- ret = fribidi_get_par_embedding_levels(shaper->ctypes + last_break,
- i - last_break + 1, &dir, shaper->emblevels + last_break);
- if (ret == 0)
- return -1;
- last_break = i + 1;
- }
- }
-
- // add embedding levels to shape runs for final runs
- for (i = 0; i < text_info->length; i++) {
- glyphs[i].shape_run_id += shaper->emblevels[i];
- }
-
-#ifdef CONFIG_HARFBUZZ
- switch (shaper->shaping_level) {
- case ASS_SHAPING_SIMPLE:
- shape_fribidi(shaper, glyphs, text_info->length);
- ass_shaper_skip_characters(text_info);
- break;
- case ASS_SHAPING_COMPLEX:
- shape_harfbuzz(shaper, glyphs, text_info->length);
- break;
- }
-#else
- shape_fribidi(shaper, glyphs, text_info->length);
- ass_shaper_skip_characters(text_info);
-#endif
-
+ check_allocations(shaper, text_info->length);
return 0;
}

@@ -909,7 +829,6 @@ ASS_Shaper *ass_shaper_new(size_t prealloc)
if (!shaper)
return NULL;

- shaper->base_direction = FRIBIDI_PAR_ON;
if (!check_allocations(shaper, prealloc))
goto error;

@@ -962,19 +881,6 @@ FriBidiStrIndex *ass_shaper_reorder(ASS_Shaper *shaper, TextInfo *text_info)
for (i = 0; i < text_info->length; i++)
shaper->cmap[i] = i;

- // Create reorder map line-by-line
- for (i = 0; i < text_info->n_lines; i++) {
- LineInfo *line = text_info->lines + i;
- FriBidiParType dir = FRIBIDI_PAR_ON;
-
- ret = fribidi_reorder_line(0,
- shaper->ctypes + line->offset, line->len, 0, dir,
- shaper->emblevels + line->offset, NULL,
- shaper->cmap + line->offset);
- if (ret == 0)
- return NULL;
- }
-
return shaper->cmap;
}

@@ -987,10 +893,5 @@ FriBidiStrIndex *ass_shaper_reorder(ASS_Shaper *shaper, TextInfo *text_info)
*/
FriBidiParType resolve_base_direction(int enc)
{
- switch (enc) {
- case -1:
- return FRIBIDI_PAR_ON;
- default:
- return FRIBIDI_PAR_LTR;
- }
+ return 0;
}
diff --git a/libass/ass_shaper.h b/libass/ass_shaper.h
index f6404fe..69a7ea9 100644
--- a/libass/ass_shaper.h
+++ b/libass/ass_shaper.h
@@ -21,7 +21,8 @@

typedef struct ass_shaper ASS_Shaper;

-#include <fribidi.h>
+typedef int FriBidiParType;
+typedef int FriBidiStrIndex;
#include "ass_render.h"

void ass_shaper_info(ASS_Library *lib);
--
2.49.0

2 changes: 1 addition & 1 deletion pkg/libass/ver
Original file line number Diff line number Diff line change
@@ -1 +1 @@
0.14.0 r1
0.14.0 r2