diff --git a/framebuffer/fbtk/text.c b/framebuffer/fbtk/text.c index f15586a92..3d3558347 100644 --- a/framebuffer/fbtk/text.c +++ b/framebuffer/fbtk/text.c @@ -29,7 +29,6 @@ #include "utils/log.h" #include "desktop/browser.h" -#include "desktop/font.h" #include "framebuffer/gui.h" #include "framebuffer/fbtk.h" @@ -342,7 +341,7 @@ text_input(fbtk_widget_t *widget, fbtk_callback_info *cbi) widget->u.text.len--; widget->u.text.text[widget->u.text.len] = 0; - nsfont.font_width(&font_style, widget->u.text.text, + fb_font_width(&font_style, widget->u.text.text, widget->u.text.len, &widget->u.text.width); caret_moved = true; @@ -428,14 +427,14 @@ text_input(fbtk_widget_t *widget, fbtk_callback_info *cbi) widget->u.text.len++; widget->u.text.text[widget->u.text.len] = '\0'; - nsfont.font_width(&font_style, widget->u.text.text, + fb_font_width(&font_style, widget->u.text.text, widget->u.text.len, &widget->u.text.width); caret_moved = true; break; } if (caret_moved) { - nsfont.font_width(&font_style, widget->u.text.text, + fb_font_width(&font_style, widget->u.text.text, widget->u.text.idx, &widget->u.text.idx_offset); fbtk_set_caret(widget, true, widget->u.text.idx_offset + border, @@ -467,7 +466,7 @@ text_input_click(fbtk_widget_t *widget, fbtk_callback_info *cbi) widget->u.text.idx = widget->u.text.len; - nsfont.font_position_in_string(&font_style, widget->u.text.text, + fb_font_position(&font_style, widget->u.text.text, widget->u.text.len, cbi->x - border, &idx, &widget->u.text.idx_offset); @@ -529,9 +528,9 @@ fbtk_set_text(fbtk_widget_t *widget, const char *text) fb_text_font_style(widget, &fh, &border, &font_style); - nsfont.font_width(&font_style, widget->u.text.text, + fb_font_width(&font_style, widget->u.text.text, widget->u.text.len, &widget->u.text.width); - nsfont.font_width(&font_style, widget->u.text.text, + fb_font_width(&font_style, widget->u.text.text, widget->u.text.idx, &widget->u.text.idx_offset); if (fbtk_get_caret(widget, &c_x, &c_y, &c_h)) { diff --git a/framebuffer/font.h b/framebuffer/font.h index 6350421e7..722a604e4 100644 --- a/framebuffer/font.h +++ b/framebuffer/font.h @@ -19,13 +19,45 @@ #ifndef NETSURF_FB_FONT_H #define NETSURF_FB_FONT_H -#include "utils/utf8.h" - +extern struct gui_layout_table *framebuffer_layout_table; extern struct gui_utf8_table *framebuffer_utf8_table; +/** + * Initialise framebuffer font handling. + */ bool fb_font_init(void); + +/** + * Finalise framebuffer font handling. + */ bool fb_font_finalise(void); +/** + * Find the position in a string where an x coordinate falls. + * + * \param[in] fstyle style for this text + * \param[in] string UTF-8 string to measure + * \param[in] length length of string, in bytes + * \param[in] x coordinate to search for + * \param[out] char_offset updated to offset in string of actual_x, [0..length] + * \param[out] actual_x updated to x coordinate of character closest to x + * \return NSERROR_OK and char_offset and actual_x updated or + * appropriate error code on faliure + */ +nserror fb_font_position(const struct plot_font_style *fstyle, const char *string, size_t length, int x, size_t *char_offset, int *actual_x); + +/** + * Measure the width of a string. + * + * \param[in] fstyle plot style for this text + * \param[in] string UTF-8 string to measure + * \param[in] length length of string, in bytes + * \param[out] width updated to width of string[0..length) + * \return NSERROR_OK and width updated or appropriate error code on faliure + */ +nserror fb_font_width(const struct plot_font_style *fstyle, const char *string, size_t length, int *width); + + #ifdef FB_USE_FREETYPE #include "framebuffer/font_freetype.h" #else diff --git a/framebuffer/font_freetype.c b/framebuffer/font_freetype.c index ec3ceab52..7756ae77b 100644 --- a/framebuffer/font_freetype.c +++ b/framebuffer/font_freetype.c @@ -28,7 +28,7 @@ #include "utils/log.h" #include "utils/nsoption.h" #include "desktop/gui_utf8.h" -#include "desktop/font.h" +#include "desktop/gui_layout.h" #include "desktop/browser.h" #include "framebuffer/gui.h" @@ -74,8 +74,14 @@ enum fb_face_e { static fb_faceid_t *fb_faces[FB_FACE_COUNT]; -/* map cache manager handle to face id */ -static FT_Error ft_face_requester(FTC_FaceID face_id, FT_Library library, FT_Pointer request_data, FT_Face *face ) +/** + * map cache manager handle to face id + */ +static FT_Error +ft_face_requester(FTC_FaceID face_id, + FT_Library library, + FT_Pointer request_data, + FT_Face *face ) { FT_Error error; fb_faceid_t *fb_face = (fb_faceid_t *)face_id; @@ -103,7 +109,9 @@ static FT_Error ft_face_requester(FTC_FaceID face_id, FT_Library library, FT_Po return error; } -/* create new framebuffer face and cause it to be loaded to check its ok */ +/** + * create new framebuffer face and cause it to be loaded to check its ok + */ static fb_faceid_t * fb_new_face(const char *option, const char *resname, const char *fontname) { @@ -132,7 +140,7 @@ fb_new_face(const char *option, const char *resname, const char *fontname) return newf; } -/* initialise font handling */ +/* exported interface documented in framebuffer/font.h */ bool fb_font_init(void) { FT_Error error; @@ -298,6 +306,7 @@ bool fb_font_init(void) return true; } +/* exported interface documented in framebuffer/font.h */ bool fb_font_finalise(void) { int i, j; @@ -324,6 +333,9 @@ bool fb_font_finalise(void) return true; } +/** + * fill freetype scalar + */ static void fb_fill_scalar(const plot_font_style_t *fstyle, FTC_Scaler srec) { int selected_face = FB_FACE_DEFAULT; @@ -380,6 +392,7 @@ static void fb_fill_scalar(const plot_font_style_t *fstyle, FTC_Scaler srec) srec->x_res = srec->y_res = browser_get_dpi(); } +/* exported interface documented in framebuffer/freetype_font.h */ FT_Glyph fb_getglyph(const plot_font_style_t *fstyle, uint32_t ucs4) { FT_UInt glyph_index; @@ -410,16 +423,9 @@ FT_Glyph fb_getglyph(const plot_font_style_t *fstyle, uint32_t ucs4) } -/** - * Measure the width of a string. - * - * \param fstyle style for this text - * \param string UTF-8 string to measure - * \param length length of string - * \param width updated to width of string[0..length) - * \return true on success, false on error and error reported - */ -static bool nsfont_width(const plot_font_style_t *fstyle, +/* exported interface documented in framebuffer/freetype_font.h */ +nserror +fb_font_width(const plot_font_style_t *fstyle, const char *string, size_t length, int *width) { @@ -442,19 +448,10 @@ static bool nsfont_width(const plot_font_style_t *fstyle, return true; } -/** - * Find the position in a string where an x coordinate falls. - * - * \param fstyle style for this text - * \param string UTF-8 string to measure - * \param length length of string - * \param x x coordinate to search for - * \param char_offset updated to offset in string of actual_x, [0..length] - * \param actual_x updated to x coordinate of character closest to x - * \return true on success, false on error and error reported - */ -static bool nsfont_position_in_string(const plot_font_style_t *fstyle, +/* exported interface documented in framebuffer/freetype_font.h */ +nserror +fb_font_position(const plot_font_style_t *fstyle, const char *string, size_t length, int x, size_t *char_offset, int *actual_x) { @@ -510,8 +507,8 @@ static bool nsfont_position_in_string(const plot_font_style_t *fstyle, * * Returning char_offset == length means no split possible */ - -static bool nsfont_split(const plot_font_style_t *fstyle, +static nserror +fb_font_split(const plot_font_style_t *fstyle, const char *string, size_t length, int x, size_t *char_offset, int *actual_x) { @@ -551,12 +548,15 @@ static bool nsfont_split(const plot_font_style_t *fstyle, return true; } -const struct font_functions nsfont = { - nsfont_width, - nsfont_position_in_string, - nsfont_split +static struct gui_layout_table layout_table = { + .width = fb_font_width, + .position = fb_font_position, + .split = fb_font_split, }; +struct gui_layout_table *framebuffer_layout_table = &layout_table; + + struct gui_utf8_table *framebuffer_utf8_table = NULL; /* diff --git a/framebuffer/font_internal.c b/framebuffer/font_internal.c index fba298f3e..7578e641a 100644 --- a/framebuffer/font_internal.c +++ b/framebuffer/font_internal.c @@ -25,7 +25,7 @@ #include "utils/nsoption.h" #include "utils/utf8.h" #include "desktop/gui_utf8.h" -#include "desktop/font.h" +#include "desktop/gui_layout.h" #include "framebuffer/gui.h" #include "framebuffer/font.h" @@ -343,9 +343,12 @@ static nserror utf8_from_local(const char *string, } -static bool nsfont_width(const plot_font_style_t *fstyle, - const char *string, size_t length, - int *width) +/* exported interface documented in framebuffer/freetype_font.h */ +nserror +fb_font_width(const plot_font_style_t *fstyle, + const char *string, + size_t length, + int *width) { size_t nxtchr = 0; @@ -364,21 +367,15 @@ static bool nsfont_width(const plot_font_style_t *fstyle, return true; } -/** - * Find the position in a string where an x coordinate falls. - * - * \param fstyle style for this text - * \param string UTF-8 string to measure - * \param length length of string - * \param x x coordinate to search for - * \param char_offset updated to offset in string of actual_x, [0..length] - * \param actual_x updated to x coordinate of character closest to x - * \return true on success, false on error and error reported - */ -static bool nsfont_position_in_string(const plot_font_style_t *fstyle, - const char *string, size_t length, - int x, size_t *char_offset, int *actual_x) +/* exported interface documented in framebuffer/freetype_font.h */ +nserror +fb_font_position(const plot_font_style_t *fstyle, + const char *string, + size_t length, + int x, + size_t *char_offset, + int *actual_x) { const int width = fb_get_font_size(fstyle) * FB_FONT_WIDTH; size_t nxtchr = 0; @@ -404,7 +401,6 @@ static bool nsfont_position_in_string(const plot_font_style_t *fstyle, } - /** * Find where to split a string to make it fit a width. * @@ -427,10 +423,13 @@ static bool nsfont_position_in_string(const plot_font_style_t *fstyle, * * Returning char_offset == length means no split possible */ - -static bool nsfont_split(const plot_font_style_t *fstyle, - const char *string, size_t length, - int x, size_t *char_offset, int *actual_x) +static nserror +fb_font_split(const plot_font_style_t *fstyle, + const char *string, + size_t length, + int x, + size_t *char_offset, + int *actual_x) { const int width = fb_get_font_size(fstyle) * FB_FONT_WIDTH; size_t nxtchr = 0; @@ -467,12 +466,16 @@ static bool nsfont_split(const plot_font_style_t *fstyle, return true; } -const struct font_functions nsfont = { - nsfont_width, - nsfont_position_in_string, - nsfont_split + +static struct gui_layout_table layout_table = { + .width = fb_font_width, + .position = fb_font_position, + .split = fb_font_split, }; +struct gui_layout_table *framebuffer_layout_table = &layout_table; + + static struct gui_utf8_table utf8_table = { .utf8_to_local = utf8_to_local, .local_to_utf8 = utf8_from_local, diff --git a/framebuffer/font_internal.h b/framebuffer/font_internal.h index d066f6bf4..f25df8de6 100644 --- a/framebuffer/font_internal.h +++ b/framebuffer/font_internal.h @@ -40,10 +40,10 @@ enum fb_font_style { enum fb_font_style fb_get_font_style(const plot_font_style_t *fstyle); int fb_get_font_size(const plot_font_style_t *fstyle); -const uint8_t *fb_get_glyph(uint32_t ucs4, enum fb_font_style style, int scale); - #define codepoint_displayable(u) \ (!(u >= 0x200b && u <= 0x200f)) +const uint8_t *fb_get_glyph(uint32_t ucs4, enum fb_font_style style, int scale); + #endif /* NETSURF_FB_FONT_INTERNAL_H */ diff --git a/framebuffer/framebuffer.c b/framebuffer/framebuffer.c index 97760cfc6..7d811aafc 100644 --- a/framebuffer/framebuffer.c +++ b/framebuffer/framebuffer.c @@ -30,6 +30,7 @@ #include "utils/utils.h" #include "utils/log.h" +#include "utils/utf8.h" #include "desktop/browser.h" #include "image/bitmap.h" diff --git a/framebuffer/gui.c b/framebuffer/gui.c index 8a29681cc..11511fe0e 100644 --- a/framebuffer/gui.c +++ b/framebuffer/gui.c @@ -2082,6 +2082,7 @@ main(int argc, char** argv) .fetch = framebuffer_fetch_table, .utf8 = framebuffer_utf8_table, .bitmap = framebuffer_bitmap_table, + .layout = framebuffer_layout_table, }; ret = netsurf_register(&framebuffer_table);