From 51a6631c19c23f1f592337586de4c2e818cbba5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sun, 1 Dec 2019 16:00:15 +0100 Subject: [PATCH] fcft: use fcft instead of local copy of font.{c,h} --- .gitmodules | 3 + config.c | 14 +- config.h | 2 +- decorations/meson.build | 2 +- font.c | 642 ---------------------------------------- font.h | 68 ----- meson.build | 13 +- modules/meson.build | 2 +- particle.h | 3 +- particles/meson.build | 2 +- subprojects/fcft | 1 + 11 files changed, 30 insertions(+), 722 deletions(-) delete mode 100644 font.c delete mode 100644 font.h create mode 160000 subprojects/fcft diff --git a/.gitmodules b/.gitmodules index 1dbfd77..3cf404e 100644 --- a/.gitmodules +++ b/.gitmodules @@ -5,3 +5,6 @@ [submodule "subprojects/tllist"] path = subprojects/tllist url = https://codeberg.org/dnkl/tllist.git +[submodule "subprojects/fcft"] + path = subprojects/fcft + url = https://codeberg.org/dnkl/fcft.git diff --git a/config.c b/config.c index 7a885dc..23cc39c 100644 --- a/config.c +++ b/config.c @@ -67,7 +67,13 @@ conf_to_color(const struct yml_node *node) struct font * conf_to_font(const struct yml_node *node) { - return font_from_name(yml_value_as_string(node)); + font_list_t font_list = tll_init(); + tll_push_back(font_list, yml_value_as_string(node)); + + struct font *font = font_from_name(font_list, NULL); + + tll_free(font_list); + return font; } struct deco * @@ -263,7 +269,11 @@ conf_to_bar(const struct yml_node *bar, enum bar_backend backend) * and particles. This allows us to specify a default font and * foreground color at top-level. */ - struct font *font = font_from_name("sans"); + font_list_t font_list = tll_init(); + tll_push_back(font_list, "sans"); + struct font *font = font_from_name(font_list, NULL); + tll_free(font_list); + pixman_color_t foreground = {0xffff, 0xffff, 0xffff, 0xffff}; /* White */ const struct yml_node *font_node = yml_get_value(bar, "font"); diff --git a/config.h b/config.h index 28e3f5a..3610c1f 100644 --- a/config.h +++ b/config.h @@ -1,6 +1,6 @@ #pragma once -#include "font.h" +#include #include "yml.h" #include "bar/bar.h" diff --git a/decorations/meson.build b/decorations/meson.build index b9cf372..4d388db 100644 --- a/decorations/meson.build +++ b/decorations/meson.build @@ -1,4 +1,4 @@ -deco_sdk = declare_dependency(dependencies: [freetype, pixman, tllist]) +deco_sdk = declare_dependency(dependencies: [pixman, tllist]) decorations = [] foreach deco : ['background', 'stack', 'underline'] diff --git a/font.c b/font.c deleted file mode 100644 index 72227e1..0000000 --- a/font.c +++ /dev/null @@ -1,642 +0,0 @@ -#include "font.h" - -#include -#include -#include -#include -#include -#include -#include - -//#include - -#define LOG_MODULE "font" -#define LOG_ENABLE_DBG 0 -#include "log.h" -#include "stride.h" - -#define min(x, y) ((x) < (y) ? (x) : (y)) - -static FT_Library ft_lib; -static mtx_t ft_lock; - -static tll(const struct font *) font_cache = tll_init(); - -static const size_t glyph_cache_size = 512; - -static void __attribute__((constructor)) -init(void) -{ - FcInit(); - FT_Init_FreeType(&ft_lib); - mtx_init(&ft_lock, mtx_plain); - -#if defined(LOG_ENABLE_DBG) && LOG_ENABLE_DBG - int raw_version = FcGetVersion(); - - /* See FC_VERSION in */ - const int major = raw_version / 10000; raw_version %= 10000; - const int minor = raw_version / 100; raw_version %= 100; - const int patch = raw_version; -#endif - - LOG_DBG("fontconfig: %d.%d.%d", major, minor, patch); -} - -static void __attribute__((destructor)) -fini(void) -{ - assert(tll_length(font_cache) == 0); - - mtx_destroy(&ft_lock); - FT_Done_FreeType(ft_lib); - FcFini(); -} - -static bool -font_destroy_no_free(struct font *font) -{ - assert(font->ref_counter > 0); - if (--font->ref_counter > 0) - return false; - - if (font->face != NULL) { - mtx_lock(&ft_lock); - FT_Done_Face(font->face); - mtx_unlock(&ft_lock); - } - - if (font->fc_pattern != NULL) - FcPatternDestroy(font->fc_pattern); - if (font->fc_fonts != NULL) - FcFontSetDestroy(font->fc_fonts); - - free(font->name); - - if (font->cache == NULL) - return true; - - for (size_t i = 0; i < glyph_cache_size; i++) { - if (font->cache[i] == NULL) - continue; - - tll_foreach(*font->cache[i], it) { - if (!it->item.valid) - continue; - - void *image = pixman_image_get_data(it->item.pix); - pixman_image_unref(it->item.pix); - free(image); - } - - tll_free(*font->cache[i]); - free(font->cache[i]); - } - free(font->cache); - - tll_foreach(font_cache, it) { - if (it->item == font) { - tll_remove(font_cache, it); - break; - } - } - - return true; -} - -/* Not used in yambar */ -#if 0 -static void -underline_strikeout_metrics(struct font *font) -{ - FT_Face ft_face = font->face; - double y_scale = ft_face->size->metrics.y_scale / 65536.; - double height = ft_face->size->metrics.height / 64.; - double descent = ft_face->size->metrics.descender / 64.; - - LOG_DBG("ft: y-scale: %f, height: %f, descent: %f", - y_scale, height, descent); - - font->underline.position = ft_face->underline_position * y_scale / 64.; - font->underline.thickness = ft_face->underline_thickness * y_scale / 64.; - - if (font->underline.position == 0.) { - font->underline.position = descent / 2.; - font->underline.thickness = fabs(descent / 5.); - } - - LOG_DBG("underline: pos=%f, thick=%f", - font->underline.position, font->underline.thickness); - - TT_OS2 *os2 = FT_Get_Sfnt_Table(ft_face, ft_sfnt_os2); - if (os2 != NULL) { - font->strikeout.position = os2->yStrikeoutPosition * y_scale / 64.; - font->strikeout.thickness = os2->yStrikeoutSize * y_scale / 64.; - } - - if (font->strikeout.position == 0.) { - font->strikeout.position = height / 2. + descent; - font->strikeout.thickness = font->underline.thickness; - } - - LOG_DBG("strikeout: pos=%f, thick=%f", - font->strikeout.position, font->strikeout.thickness); -} -#endif - -static bool -from_font_set(FcPattern *pattern, FcFontSet *fonts, int start_idx, - struct font *font, bool is_fallback) -{ - memset(font, 0, sizeof(*font)); - - FcChar8 *face_file = NULL; - FcPattern *final_pattern = NULL; - int font_idx = -1; - - for (int i = start_idx; i < fonts->nfont; i++) { - FcPattern *pat = FcFontRenderPrepare(NULL, pattern, fonts->fonts[i]); - assert(pat != NULL); - - if (FcPatternGetString(pat, FC_FT_FACE, 0, &face_file) != FcResultMatch) { - if (FcPatternGetString(pat, FC_FILE, 0, &face_file) != FcResultMatch) { - FcPatternDestroy(pat); - continue; - } - } - - final_pattern = pat; - font_idx = i; - break; - } - - assert(font_idx != -1); - assert(final_pattern != NULL); - - double dpi; - if (FcPatternGetDouble(final_pattern, FC_DPI, 0, &dpi) != FcResultMatch) - dpi = 96; - - double size; - double pixel_size; - if (FcPatternGetDouble(final_pattern, FC_SIZE, 0, &size) != FcResultMatch || - FcPatternGetDouble(final_pattern, FC_PIXEL_SIZE, 0, &pixel_size) != FcResultMatch) - { - LOG_ERR("%s: failed to get size", face_file); - FcPatternDestroy(final_pattern); - return false; - } - - FcBool scalable; - if (FcPatternGetBool(final_pattern, FC_SCALABLE, 0, &scalable) != FcResultMatch) - scalable = FcTrue; - - FcBool outline; - if (FcPatternGetBool(final_pattern, FC_OUTLINE, 0, &outline) != FcResultMatch) - outline = FcTrue; - - double pixel_fixup; - if (FcPatternGetDouble(final_pattern, "pixelsizefixupfactor", 0, &pixel_fixup) != FcResultMatch) { - /* - * Force a fixup factor on scalable bitmap fonts (typically - * emoji fonts). The fixup factor is - * requested-pixel-size / actual-pixels-size - */ - if (scalable && !outline) { - double requested_pixel_size; - if (FcPatternGetDouble(pattern, FC_PIXEL_SIZE, 0, &requested_pixel_size) != FcResultMatch) { - double requested_size; - if (FcPatternGetDouble(pattern, FC_SIZE, 0, &requested_size) != FcResultMatch) - requested_size = size; - requested_pixel_size = requested_size * dpi / 72; - } - pixel_fixup = requested_pixel_size / pixel_size; - - LOG_DBG("estimated fixup factor to %f (requested pixel size: %f, actual: %f)", - pixel_fixup, requested_pixel_size, pixel_size); - } else - pixel_fixup = 1.; - } - - LOG_DBG("loading: %s", face_file); - - mtx_lock(&ft_lock); - FT_Face ft_face; - FT_Error ft_err = FT_New_Face(ft_lib, (const char *)face_file, 0, &ft_face); - mtx_unlock(&ft_lock); - if (ft_err != 0) - LOG_ERR("%s: failed to create FreeType face", face_file); - - if ((ft_err = FT_Set_Pixel_Sizes(ft_face, 0, pixel_size)) != 0) { - LOG_WARN("failed to set pixel size"); - mtx_lock(&ft_lock); - FT_Done_Face(ft_face); - mtx_unlock(&ft_lock); - FcPatternDestroy(final_pattern); - return false; - } - - FcBool fc_hinting; - if (FcPatternGetBool(final_pattern, FC_HINTING,0, &fc_hinting) != FcResultMatch) - fc_hinting = FcTrue; - - FcBool fc_antialias; - if (FcPatternGetBool(final_pattern, FC_ANTIALIAS, 0, &fc_antialias) != FcResultMatch) - fc_antialias = FcTrue; - - int fc_hintstyle; - if (FcPatternGetInteger(final_pattern, FC_HINT_STYLE, 0, &fc_hintstyle) != FcResultMatch) - fc_hintstyle = FC_HINT_SLIGHT; - - int fc_rgba; - if (FcPatternGetInteger(final_pattern, FC_RGBA, 0, &fc_rgba) != FcResultMatch) - fc_rgba = FC_RGBA_UNKNOWN; - - int load_flags = 0; - if (!fc_antialias) { - if (!fc_hinting || fc_hintstyle == FC_HINT_NONE) - load_flags |= FT_LOAD_MONOCHROME | FT_LOAD_NO_HINTING | FT_LOAD_TARGET_NORMAL; - else - load_flags |= FT_LOAD_MONOCHROME | FT_LOAD_TARGET_MONO; - } else { - if (!fc_hinting || fc_hintstyle == FC_HINT_NONE) - load_flags |= FT_LOAD_DEFAULT | FT_LOAD_NO_HINTING | FT_LOAD_TARGET_NORMAL; - else if (fc_hinting && fc_hintstyle == FC_HINT_SLIGHT) - load_flags |= FT_LOAD_DEFAULT | FT_LOAD_TARGET_LIGHT; - else if (fc_rgba == FC_RGBA_RGB || fc_rgba == FC_RGBA_BGR) - load_flags |= FT_LOAD_DEFAULT | FT_LOAD_TARGET_LCD; - else if (fc_rgba == FC_RGBA_VRGB || fc_rgba == FC_RGBA_VBGR) - load_flags |= FT_LOAD_DEFAULT | FT_LOAD_TARGET_LCD_V; - else - load_flags |= FT_LOAD_DEFAULT | FT_LOAD_TARGET_NORMAL; - } - - FcBool fc_embeddedbitmap; - if (FcPatternGetBool(final_pattern, FC_EMBEDDED_BITMAP, 0, &fc_embeddedbitmap) != FcResultMatch) - fc_embeddedbitmap = FcTrue; - - if (!fc_embeddedbitmap) - load_flags |= FT_LOAD_NO_BITMAP; - - int render_flags = 0; - if (!fc_antialias) - render_flags |= FT_RENDER_MODE_MONO; - else { - if (fc_rgba == FC_RGBA_RGB || fc_rgba == FC_RGBA_BGR) - render_flags |= FT_RENDER_MODE_LCD; - else if (fc_rgba == FC_RGBA_VRGB || fc_rgba == FC_RGBA_VBGR) - render_flags |= FT_RENDER_MODE_LCD_V; - else - render_flags |= FT_RENDER_MODE_NORMAL; - } - - int fc_lcdfilter; - if (FcPatternGetInteger(final_pattern, FC_LCD_FILTER, 0, &fc_lcdfilter) != FcResultMatch) - fc_lcdfilter = FC_LCD_DEFAULT; - - switch (fc_lcdfilter) { - case FC_LCD_NONE: font->lcd_filter = FT_LCD_FILTER_NONE; break; - case FC_LCD_DEFAULT: font->lcd_filter = FT_LCD_FILTER_DEFAULT; break; - case FC_LCD_LIGHT: font->lcd_filter = FT_LCD_FILTER_LIGHT; break; - case FC_LCD_LEGACY: font->lcd_filter = FT_LCD_FILTER_LEGACY; break; - } - - FcPatternDestroy(final_pattern); - - font->face = ft_face; - font->load_flags = load_flags | FT_LOAD_COLOR; - font->render_flags = render_flags; - font->pixel_size_fixup = pixel_fixup; - font->bgr = fc_rgba == FC_RGBA_BGR || fc_rgba == FC_RGBA_VBGR; - font->fc_idx = font_idx; - font->is_fallback = is_fallback; - font->ref_counter = 1; - - double max_x_advance = ft_face->size->metrics.max_advance / 64.; - double height = ft_face->size->metrics.height / 64.; - double descent = ft_face->size->metrics.descender / 64.; - double ascent = ft_face->size->metrics.ascender / 64.; - - font->height = height * font->pixel_size_fixup; - font->descent = -descent * font->pixel_size_fixup; - font->ascent = ascent * font->pixel_size_fixup; - font->max_x_advance = max_x_advance * font->pixel_size_fixup; - - LOG_DBG("metrics: height: %d, descent: %d, ascent: %d, x-advance: %d", - font->height, font->descent, font->ascent, font->max_x_advance); - - if (!is_fallback) { - font->fc_pattern = pattern; - font->fc_fonts = fonts; - font->cache = calloc(glyph_cache_size, sizeof(font->cache[0])); - } - - /* Not used in yambar */ - /* underline_strikeout_metrics(font); */ - return true; -} - -struct font * -font_from_name(const char *name) -{ - LOG_DBG("instantiating %s", name); - - tll_foreach(font_cache, it) { - if (strcmp(it->item->name, name) == 0) - return font_clone(it->item); - } - - FcPattern *pattern = FcNameParse((const unsigned char *)name); - if (pattern == NULL) { - LOG_ERR("%s: failed to lookup font", name); - return NULL; - } - - if (!FcConfigSubstitute(NULL, pattern, FcMatchPattern)) { - LOG_ERR("%s: failed to do config substitution", name); - FcPatternDestroy(pattern); - return NULL; - } - - FcDefaultSubstitute(pattern); - - FcResult result; - FcFontSet *fonts = FcFontSort(NULL, pattern, FcTrue, NULL, &result); - if (result != FcResultMatch) { - LOG_ERR("%s: failed to match font", name); - FcPatternDestroy(pattern); - return NULL; - } - - struct font *font = malloc(sizeof(*font)); - if (!from_font_set(pattern, fonts, 0, font, false)) { - free(font); - FcFontSetDestroy(fonts); - FcPatternDestroy(pattern); - return NULL; - } - - font->name = strdup(name); - tll_push_back(font_cache, font); - return font; -} - -static size_t -hash_index(wchar_t wc) -{ - return wc % glyph_cache_size; -} - -static bool -glyph_for_wchar(const struct font *font, wchar_t wc, struct glyph *glyph) -{ - /* - * LCD filter is per library instance. Thus we need to re-set it - * every time... - * - * Also note that many freetype builds lack this feature - * (FT_CONFIG_OPTION_SUBPIXEL_RENDERING must be defined, and isn't - * by default) */ - FT_Error err = FT_Library_SetLcdFilter(ft_lib, font->lcd_filter); - if (err != 0 && err != FT_Err_Unimplemented_Feature) - goto err; - - FT_UInt idx = FT_Get_Char_Index(font->face, wc); - if (idx == 0) { - if (font->is_fallback) - return false; - - /* No glyph in this font, try fontconfig fallback fonts */ - - /* Try fontconfig fallback fonts */ - assert(font->fc_pattern != NULL); - assert(font->fc_fonts != NULL); - assert(font->fc_idx != -1); - - for (int i = font->fc_idx + 1; i < font->fc_fonts->nfont; i++) { - struct font fallback; - if (!from_font_set(font->fc_pattern, font->fc_fonts, i, &fallback, true)) - continue; - - if (glyph_for_wchar(&fallback, wc, glyph)) { - LOG_DBG("%C: used fontconfig fallback", wc); - font_destroy_no_free(&fallback); - return true; - } - - font_destroy_no_free(&fallback); - } - - LOG_WARN("%C: no glyph found (in neither the main font, " - "nor any fallback fonts)", wc); - } - - err = FT_Load_Glyph(font->face, idx, font->load_flags); - if (err != 0) { - LOG_ERR("load failed"); - goto err; - } - - err = FT_Render_Glyph(font->face->glyph, font->render_flags); - if (err != 0) - goto err; - - assert(font->face->glyph->format == FT_GLYPH_FORMAT_BITMAP); - - FT_Bitmap *bitmap = &font->face->glyph->bitmap; - if (bitmap->width == 0) - goto err; - - pixman_format_code_t pix_format; - int width; - int rows; - - switch (bitmap->pixel_mode) { - case FT_PIXEL_MODE_MONO: - pix_format = PIXMAN_a1; - width = bitmap->width; - rows = bitmap->rows; - break; - - case FT_PIXEL_MODE_GRAY: - pix_format = PIXMAN_a8; - width = bitmap->width; - rows = bitmap->rows; - break; - - case FT_PIXEL_MODE_LCD: - pix_format = PIXMAN_x8r8g8b8; - width = bitmap->width / 3; - rows = bitmap->rows; - break; - - case FT_PIXEL_MODE_LCD_V: - pix_format = PIXMAN_x8r8g8b8; - width = bitmap->width; - rows = bitmap->rows / 3; - break; - - case FT_PIXEL_MODE_BGRA: - pix_format = PIXMAN_a8r8g8b8; - width = bitmap->width; - rows = bitmap->rows; - break; - - default: - LOG_ERR("unimplemented: FT pixel mode: %d", bitmap->pixel_mode); - goto err; - break; - } - - int stride = stride_for_format_and_width(pix_format, width); - assert(stride >= bitmap->pitch); - - uint8_t *data = malloc(rows * stride); - - /* Convert FT bitmap to pixman image */ - switch (bitmap->pixel_mode) { - case FT_PIXEL_MODE_MONO: - for (size_t r = 0; r < bitmap->rows; r++) { - for (size_t c = 0; c < (bitmap->width + 7) / 8; c++) { - uint8_t v = bitmap->buffer[r * bitmap->pitch + c]; - uint8_t reversed = 0; - for (size_t i = 0; i < min(8, bitmap->width - c * 8); i++) - reversed |= ((v >> (7 - i)) & 1) << i; - - data[r * stride + c] = reversed; - } - } - break; - - case FT_PIXEL_MODE_GRAY: - for (size_t r = 0; r < bitmap->rows; r++) { - for (size_t c = 0; c < bitmap->width; c++) - data[r * stride + c] = bitmap->buffer[r * bitmap->pitch + c]; - } - break; - - case FT_PIXEL_MODE_BGRA: - assert(stride == bitmap->pitch); - memcpy(data, bitmap->buffer, bitmap->rows * bitmap->pitch); - break; - - case FT_PIXEL_MODE_LCD: - for (size_t r = 0; r < bitmap->rows; r++) { - for (size_t c = 0; c < bitmap->width; c += 3) { - unsigned char _r = bitmap->buffer[r * bitmap->pitch + c + (font->bgr ? 2 : 0)]; - unsigned char _g = bitmap->buffer[r * bitmap->pitch + c + 1]; - unsigned char _b = bitmap->buffer[r * bitmap->pitch + c + (font->bgr ? 0 : 2)]; - - uint32_t *p = (uint32_t *)&data[r * stride + 4 * (c / 3)]; - *p = _r << 16 | _g << 8 | _b; - } - } - break; - - case FT_PIXEL_MODE_LCD_V: - /* Unverified */ - for (size_t r = 0; r < bitmap->rows; r += 3) { - for (size_t c = 0; c < bitmap->width; c++) { - unsigned char _r = bitmap->buffer[(r + (font->bgr ? 2 : 0)) * bitmap->pitch + c]; - unsigned char _g = bitmap->buffer[(r + 1) * bitmap->pitch + c]; - unsigned char _b = bitmap->buffer[(r + (font->bgr ? 0 : 2)) * bitmap->pitch + c]; - - uint32_t *p = (uint32_t *)&data[r / 3 * stride + 4 * c]; - *p = _r << 16 | _g << 8 | _b; - } - } - break; - - default: - abort(); - break; - } - - pixman_image_t *pix = pixman_image_create_bits_no_clear( - pix_format, width, rows, (uint32_t *)data, stride); - - if (pix == NULL) { - free(data); - goto err; - } - - pixman_image_set_component_alpha( - pix, - bitmap->pixel_mode == FT_PIXEL_MODE_LCD || - bitmap->pixel_mode == FT_PIXEL_MODE_LCD_V); - - if (font->pixel_size_fixup != 1.) { - struct pixman_transform scale; - pixman_transform_init_scale( - &scale, - pixman_double_to_fixed(1. / font->pixel_size_fixup), - pixman_double_to_fixed(1. / font->pixel_size_fixup)); - pixman_image_set_transform(pix, &scale); - pixman_image_set_filter(pix, PIXMAN_FILTER_BEST, NULL, 0); - } - - *glyph = (struct glyph){ - .wc = wc, - .cols = wcwidth(wc), - .pix = pix, - .x = font->face->glyph->bitmap_left * font->pixel_size_fixup, - .y = ceil(font->face->glyph->bitmap_top * font->pixel_size_fixup), - .x_advance = ceil(font->face->glyph->advance.x / 64) * font->pixel_size_fixup, - .width = width, - .height = rows, - .valid = true, - }; - - return true; - -err: - *glyph = (struct glyph){ - .wc = wc, - .valid = false, - }; - return false; -} - -const struct glyph * -font_glyph_for_wc(struct font *font, wchar_t wc) -{ - assert(font->cache != NULL); - size_t hash_idx = hash_index(wc); - hash_entry_t *hash_entry = font->cache[hash_idx]; - - if (hash_entry != NULL) { - tll_foreach(*hash_entry, it) { - if (it->item.wc == wc) - return it->item.valid ? &it->item : NULL; - } - } - - struct glyph glyph; - bool got_glyph = glyph_for_wchar(font, wc, &glyph); - - if (hash_entry == NULL) { - hash_entry = calloc(1, sizeof(*hash_entry)); - - assert(font->cache[hash_idx] == NULL); - font->cache[hash_idx] = hash_entry; - } - - assert(hash_entry != NULL); - tll_push_back(*hash_entry, glyph); - return got_glyph ? &tll_back(*hash_entry) : NULL; -} - -struct font * -font_clone(const struct font *_font) -{ - struct font *font = (struct font *)_font; - font->ref_counter++; - return font; -} - -void -font_destroy(struct font *font) -{ - if (font_destroy_no_free(font)) - free(font); -} diff --git a/font.h b/font.h deleted file mode 100644 index 395db18..0000000 --- a/font.h +++ /dev/null @@ -1,68 +0,0 @@ -#pragma once - -#include -#include - -#include -#include FT_FREETYPE_H -#include FT_LCD_FILTER_H -#include -#include - -#include "tllist.h" - -struct glyph { - wchar_t wc; - int cols; - - pixman_image_t *pix; - int x; - int y; - int x_advance; - int width; - int height; - - bool valid; -}; - -typedef tll(struct glyph) hash_entry_t; - -struct font { - char *name; - - FcPattern *fc_pattern; - FcFontSet *fc_fonts; - int fc_idx; - - FT_Face face; - int load_flags; - int render_flags; - FT_LcdFilter lcd_filter; - double pixel_size_fixup; /* Scale factor - should only be used with ARGB32 glyphs */ - bool bgr; /* True for FC_RGBA_BGR and FC_RGBA_VBGR */ - - int height; - int descent; - int ascent; - int max_x_advance; - - struct { - double position; - double thickness; - } underline; - - struct { - double position; - double thickness; - } strikeout; - - hash_entry_t **cache; - - bool is_fallback; - int ref_counter; -}; - -struct font *font_from_name(const char *name); -struct font *font_clone(const struct font *font); -const struct glyph *font_glyph_for_wc(struct font *font, wchar_t wc); -void font_destroy(struct font *font); diff --git a/meson.build b/meson.build index 2d17375..a46497b 100644 --- a/meson.build +++ b/meson.build @@ -14,8 +14,6 @@ plugs_as_libs = get_option('core-plugins-as-shared-libraries') cc = meson.get_compiler('c') dl = cc.find_library('dl') threads = dependency('threads') -freetype = dependency('freetype2') -fontconfig = dependency('fontconfig') pixman = dependency('pixman-1') yaml = dependency('yaml-0.1') @@ -64,6 +62,13 @@ else tllist = dependency('tllist') endif +fcft_proj = subproject('fcft', required: false) +if fcft_proj.found() + fcft = fcft_proj.get_variable('fcft') +else + fcft = dependency('fcft') +endif + subdir('completions') subdir('doc') subdir('bar') @@ -84,7 +89,6 @@ yambar = executable( 'config-verify.c', 'config-verify.h', 'config.c', 'config.h', 'decoration.h', - 'font.c', 'font.h', 'log.c', 'log.h', 'main.c', 'module.c', 'module.h', @@ -93,7 +97,7 @@ yambar = executable( 'tag.c', 'tag.h', 'yml.c', 'yml.h', version, - dependencies: [bar, freetype, fontconfig, pixman, yaml, threads, dl, tllist] + + dependencies: [bar, pixman, yaml, threads, dl, tllist, fcft] + decorations + particles + modules, build_rpath: '$ORIGIN/modules:$ORIGIN/decorations:$ORIGIN/particles', export_dynamic: true, @@ -109,7 +113,6 @@ install_headers( 'config.h', 'config-verify.h', 'decoration.h', - 'font.h', 'log.h', 'module.h', 'particle.h', diff --git a/modules/meson.build b/modules/meson.build index 2f22c9d..ccafb8a 100644 --- a/modules/meson.build +++ b/modules/meson.build @@ -1,4 +1,4 @@ -module_sdk = declare_dependency(dependencies: [freetype, pixman, threads, tllist]) +module_sdk = declare_dependency(dependencies: [pixman, threads, tllist]) modules = [] diff --git a/particle.h b/particle.h index 789fd87..9bd417e 100644 --- a/particle.h +++ b/particle.h @@ -1,9 +1,10 @@ #pragma once #include +#include + #include "color.h" #include "decoration.h" -#include "font.h" #include "tag.h" struct bar; diff --git a/particles/meson.build b/particles/meson.build index 484ecfd..f571f12 100644 --- a/particles/meson.build +++ b/particles/meson.build @@ -1,4 +1,4 @@ -particle_sdk = declare_dependency(dependencies: [freetype, fontconfig, pixman, tllist]) +particle_sdk = declare_dependency(dependencies: [pixman, tllist, fcft]) particles = [] foreach particle : ['empty', 'list', 'map', 'progress-bar', 'ramp', 'string'] diff --git a/subprojects/fcft b/subprojects/fcft new file mode 160000 index 0000000..6976022 --- /dev/null +++ b/subprojects/fcft @@ -0,0 +1 @@ +Subproject commit 69760222af15611216d2e6b38f004d5ad2377651