From 28ecbf82ed3024f51be4c87928fd91bacfc15cbc Mon Sep 17 00:00:00 2001 From: Vincent Sanders Date: Fri, 26 Feb 2021 13:33:08 +0000 Subject: Initial minimal FLTK toolkit implementation --- frontends/fltk/layout.cpp | 141 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 141 insertions(+) create mode 100644 frontends/fltk/layout.cpp (limited to 'frontends/fltk/layout.cpp') diff --git a/frontends/fltk/layout.cpp b/frontends/fltk/layout.cpp new file mode 100644 index 000000000..45044307d --- /dev/null +++ b/frontends/fltk/layout.cpp @@ -0,0 +1,141 @@ +/* + * Copyright 2021 Vincent Sanders + * + * This file is part of NetSurf, http://www.netsurf-browser.org/ + * + * NetSurf is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * NetSurf is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** + * \file + * Implementation of netsurf layout operations for fltk. + */ + +#include + +extern "C" { + +#include "utils/errors.h" +#include "utils/utf8.h" +#include "netsurf/layout.h" +#include "netsurf/plot_style.h" + +} + +#include "fltk/layout.h" + +/** + * 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 + */ +static nserror +nsfltk_layout_width(const struct plot_font_style *fstyle, + const char *string, + size_t length, + int *width) +{ + *width = (fstyle->size * utf8_bounded_length(string, length)) / PLOT_STYLE_SCALE; + return NSERROR_OK; +} + + +/** + * 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 + */ +static nserror +nsfltk_layout_position(const struct plot_font_style *fstyle, + const char *string, + size_t length, + int x, + size_t *char_offset, + int *actual_x) +{ + *char_offset = x / (fstyle->size / PLOT_STYLE_SCALE); + if (*char_offset > length) + *char_offset = length; + *actual_x = *char_offset * (fstyle->size / PLOT_STYLE_SCALE); + return NSERROR_OK; +} + + +/** + * Find where to split a string to make it fit a width. + * + * \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 width available + * \param[out] char_offset updated to offset in string of actual_x, [1..length] + * \param[out] actual_x updated to x coordinate of character closest to x + * \return NSERROR_OK or appropriate error code on faliure + * + * On exit, char_offset indicates first character after split point. + * + * \note char_offset of 0 must never be returned. + * + * Returns: + * char_offset giving split point closest to x, where actual_x <= x + * else + * char_offset giving split point closest to x, where actual_x > x + * + * Returning char_offset == length means no split possible + */ +static nserror +nsfltk_layout_split(const struct plot_font_style *fstyle, + const char *string, + size_t length, + int x, + size_t *char_offset, + int *actual_x) +{ + int c_off = *char_offset = x / (fstyle->size / PLOT_STYLE_SCALE); + if (*char_offset > length) { + *char_offset = length; + } else { + while (*char_offset > 0) { + if (string[*char_offset] == ' ') + break; + (*char_offset)--; + } + if (*char_offset == 0) { + *char_offset = c_off; + while (*char_offset < length && string[*char_offset] != ' ') { + (*char_offset)++; + } + } + } + *actual_x = *char_offset * (fstyle->size / PLOT_STYLE_SCALE); + return NSERROR_OK; +} + +static struct gui_layout_table layout_table = { + .width = nsfltk_layout_width, + .position = nsfltk_layout_position, + .split = nsfltk_layout_split, +}; + +struct gui_layout_table *nsfltk_layout_table = &layout_table; -- cgit v1.2.3