mirror of
https://github.com/netsurf-browser/netsurf
synced 2024-11-23 06:51:26 +03:00
Merge branch 'master' of git://git.netsurf-browser.org/netsurf
Conflicts: gtk/font_pango.c Conflict resolved.
This commit is contained in:
commit
315f5a8ca1
28
amiga/gui.c
28
amiga/gui.c
@ -1961,7 +1961,6 @@ void ami_handle_msg(void)
|
||||
{
|
||||
if(gwin->redraw_required || gwin->bw->reformat_pending) {
|
||||
ami_do_redraw(gwin);
|
||||
gwin->bw->window->deferred = false;
|
||||
}
|
||||
|
||||
gui_window_update_box_deferred(gwin->bw->window);
|
||||
@ -3904,6 +3903,7 @@ void ami_do_redraw(struct gui_window_2 *gwin)
|
||||
|
||||
if(gwin->redraw_scroll)
|
||||
{
|
||||
struct rect rect;
|
||||
int x0, y0, x1, y1;
|
||||
|
||||
gwin->bw->window->c_h_temp = gwin->bw->window->c_h;
|
||||
@ -3916,28 +3916,28 @@ void ami_do_redraw(struct gui_window_2 *gwin)
|
||||
|
||||
if(vcurrent>oldv) /* Going down */
|
||||
{
|
||||
ami_spacebox_to_ns_coords(gwin, &x0, &y0, 0, height - (vcurrent - oldv) - 1);
|
||||
ami_spacebox_to_ns_coords(gwin, &x1, &y1, width + 1, height + 1);
|
||||
ami_do_redraw_limits(gwin->bw->window, gwin->bw, true, x0, y0, x1, y1);
|
||||
ami_spacebox_to_ns_coords(gwin, &rect.x0, &rect.y0, 0, height - (vcurrent - oldv) - 1);
|
||||
ami_spacebox_to_ns_coords(gwin, &rect.x1, &rect.y1, width + 1, height + 1);
|
||||
gui_window_update_box(gwin->bw->window, &rect);
|
||||
}
|
||||
else if(vcurrent<oldv) /* Going up */
|
||||
{
|
||||
ami_spacebox_to_ns_coords(gwin, &x0, &y0, 0, 0);
|
||||
ami_spacebox_to_ns_coords(gwin, &x1, &y1, width + 1, oldv - vcurrent + 1);
|
||||
ami_do_redraw_limits(gwin->bw->window, gwin->bw, true, x0, y0, x1, y1);
|
||||
ami_spacebox_to_ns_coords(gwin, &rect.x0, &rect.y0, 0, 0);
|
||||
ami_spacebox_to_ns_coords(gwin, &rect.x1, &rect.y1, width + 1, oldv - vcurrent + 1);
|
||||
gui_window_update_box(gwin->bw->window, &rect);
|
||||
}
|
||||
|
||||
if(hcurrent>oldh) /* Going right */
|
||||
{
|
||||
ami_spacebox_to_ns_coords(gwin, &x0, &y0, width - (hcurrent - oldh), 0);
|
||||
ami_spacebox_to_ns_coords(gwin, &x1, &y1, width + 1, height + 1);
|
||||
ami_do_redraw_limits(gwin->bw->window, gwin->bw, true, x0, y0, x1, y1);
|
||||
ami_spacebox_to_ns_coords(gwin, &rect.x0, &rect.y0, width - (hcurrent - oldh), 0);
|
||||
ami_spacebox_to_ns_coords(gwin, &rect.x1, &rect.y1, width + 1, height + 1);
|
||||
gui_window_update_box(gwin->bw->window, &rect);
|
||||
}
|
||||
else if(hcurrent<oldh) /* Going left */
|
||||
{
|
||||
ami_spacebox_to_ns_coords(gwin, &x0, &y0, 0, 0);
|
||||
ami_spacebox_to_ns_coords(gwin, &x1, &y1, oldh - hcurrent + 1, height + 1);
|
||||
ami_do_redraw_limits(gwin->bw->window, gwin->bw, true, x0, y0, x1, y1);
|
||||
ami_spacebox_to_ns_coords(gwin, &rect.x0, &rect.y0, 0, 0);
|
||||
ami_spacebox_to_ns_coords(gwin, &rect.x1, &rect.y1, oldh - hcurrent + 1, height + 1);
|
||||
gui_window_update_box(gwin->bw->window, &rect);
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -3975,6 +3975,8 @@ void ami_do_redraw(struct gui_window_2 *gwin)
|
||||
|
||||
ami_reset_pointer(gwin);
|
||||
}
|
||||
/* Tell NetSurf not to bother with the next queued box redraw, as we've redrawn everything. */
|
||||
gwin->bw->window->deferred = false;
|
||||
}
|
||||
|
||||
ami_update_buttons(gwin);
|
||||
|
@ -443,8 +443,9 @@ static int str_split( FONT_PLOTTER self, const plot_font_style_t *fstyle,
|
||||
last_space_idx = nxtchr;
|
||||
}
|
||||
*actual_x += glyph->advance.x >> 16;
|
||||
if (*actual_x > x) {
|
||||
/* string has exceeded available width return previous space*/
|
||||
if (*actual_x > x && last_space_idx != 0) {
|
||||
/* string has exceeded available width and we've
|
||||
* found a space; return previous space */
|
||||
*actual_x = last_space_x;
|
||||
*char_offset = last_space_idx;
|
||||
return true;
|
||||
|
@ -118,7 +118,7 @@ static int str_split( FONT_PLOTTER self, const plot_font_style_t * fstyle, const
|
||||
size_t length,int x, size_t *char_offset, int *actual_x )
|
||||
{
|
||||
const struct fb_font_desc* fb_font = fb_get_font(fstyle);
|
||||
*char_offset = x / fb_font->width;
|
||||
int c_off = *char_offset = x / fb_font->width;
|
||||
if (*char_offset > length) {
|
||||
*char_offset = length;
|
||||
} else {
|
||||
@ -127,6 +127,13 @@ static int str_split( FONT_PLOTTER self, const plot_font_style_t * fstyle, const
|
||||
break;
|
||||
(*char_offset)--;
|
||||
}
|
||||
if (*char_offset == 0) {
|
||||
*char_offset = c_off;
|
||||
while (*char_offset < length &&
|
||||
string[*char_offset] != ' ') {
|
||||
(*char_offset)++;
|
||||
}
|
||||
}
|
||||
}
|
||||
*actual_x = *char_offset * fb_font->width;
|
||||
return( 1 );
|
||||
|
@ -164,7 +164,7 @@ static int str_split( FONT_PLOTTER self, const plot_font_style_t * fstyle, const
|
||||
last_space_idx = nxtchr;
|
||||
}
|
||||
*actual_x += cellw;
|
||||
if (*actual_x > x) {
|
||||
if (*actual_x > x && last_space_idx != 0) {
|
||||
*actual_x = last_space_x;
|
||||
*char_offset = last_space_idx;
|
||||
//printf("at: %s\n", lstr);
|
||||
|
@ -157,17 +157,24 @@ bool nsfont_position_in_string(const plot_font_style_t *fstyle,
|
||||
/**
|
||||
* Find where to split a string to make it fit a width.
|
||||
*
|
||||
* \param fstyle style for this text
|
||||
* \param string UTF-8 string to measure
|
||||
* \param length length of string
|
||||
* \param x width available
|
||||
* \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
|
||||
* \param fstyle style for this text
|
||||
* \param string UTF-8 string to measure
|
||||
* \param length length of string, in bytes
|
||||
* \param x width available
|
||||
* \param char_offset updated to offset in string of actual_x, [1..length]
|
||||
* \param actual_x updated to x coordinate of character closest to x
|
||||
* \return true on success, false on error and error reported
|
||||
*
|
||||
* On exit, [char_offset == 0 ||
|
||||
* string[char_offset] == ' ' ||
|
||||
* char_offset == length]
|
||||
* On exit, char_offset indicates first character after split point.
|
||||
*
|
||||
* Note: char_offset of 0 should 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
|
||||
*/
|
||||
|
||||
bool nsfont_split(const plot_font_style_t *fstyle,
|
||||
@ -189,13 +196,13 @@ bool nsfont_split(const plot_font_style_t *fstyle,
|
||||
int i;
|
||||
int last_space = 0;
|
||||
font.GetEscapements(string, len, escapements);
|
||||
// slow but it should work
|
||||
// very slow but it should work
|
||||
for (i = 0; string[index] && i < len; i++) {
|
||||
if (string[index] == ' ') {
|
||||
last_x = current;
|
||||
last_space = index;
|
||||
}
|
||||
if (x < current) {
|
||||
if (x < current && last_space != 0) {
|
||||
*actual_x = (int)last_x;
|
||||
*char_offset = last_space;
|
||||
return true;
|
||||
|
@ -497,15 +497,22 @@ static bool nsfont_position_in_string(const plot_font_style_t *fstyle,
|
||||
*
|
||||
* \param fstyle style for this text
|
||||
* \param string UTF-8 string to measure
|
||||
* \param length length of string
|
||||
* \param length length of string, in bytes
|
||||
* \param x width available
|
||||
* \param char_offset updated to offset in string of actual_x, [0..length]
|
||||
* \param char_offset updated to offset in string of actual_x, [1..length]
|
||||
* \param actual_x updated to x coordinate of character closest to x
|
||||
* \return true on success, false on error and error reported
|
||||
*
|
||||
* On exit, [char_offset == 0 ||
|
||||
* string[char_offset] == ' ' ||
|
||||
* char_offset == length]
|
||||
* On exit, char_offset indicates first character after split point.
|
||||
*
|
||||
* Note: char_offset of 0 should 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 bool nsfont_split(const plot_font_style_t *fstyle,
|
||||
@ -532,10 +539,9 @@ static bool nsfont_split(const plot_font_style_t *fstyle,
|
||||
}
|
||||
|
||||
*actual_x += glyph->advance.x >> 16;
|
||||
if (*actual_x > x) {
|
||||
/* string has exceeded available width return previous
|
||||
* space
|
||||
*/
|
||||
if (*actual_x > x && last_space_idx != 0) {
|
||||
/* string has exceeded available width and we've
|
||||
* found a space; return previous space */
|
||||
*actual_x = last_space_x;
|
||||
*char_offset = last_space_idx;
|
||||
return true;
|
||||
|
@ -121,20 +121,28 @@ static bool nsfont_position_in_string(const plot_font_style_t *fstyle,
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Find where to split a string to make it fit a width.
|
||||
*
|
||||
* \param fstyle style for this text
|
||||
* \param string UTF-8 string to measure
|
||||
* \param length length of string
|
||||
* \param length length of string, in bytes
|
||||
* \param x width available
|
||||
* \param char_offset updated to offset in string of actual_x, [0..length]
|
||||
* \param char_offset updated to offset in string of actual_x, [1..length]
|
||||
* \param actual_x updated to x coordinate of character closest to x
|
||||
* \return true on success, false on error and error reported
|
||||
*
|
||||
* On exit, [char_offset == 0 ||
|
||||
* string[char_offset] == ' ' ||
|
||||
* char_offset == length]
|
||||
* On exit, char_offset indicates first character after split point.
|
||||
*
|
||||
* Note: char_offset of 0 should 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 bool nsfont_split(const plot_font_style_t *fstyle,
|
||||
@ -143,7 +151,7 @@ static bool nsfont_split(const plot_font_style_t *fstyle,
|
||||
{
|
||||
|
||||
const struct fb_font_desc* fb_font = fb_get_font(fstyle);
|
||||
*char_offset = x / fb_font->width;
|
||||
int c_off = *char_offset = x / fb_font->width;
|
||||
if (*char_offset > length) {
|
||||
*char_offset = length;
|
||||
} else {
|
||||
@ -152,6 +160,13 @@ static bool nsfont_split(const plot_font_style_t *fstyle,
|
||||
break;
|
||||
(*char_offset)--;
|
||||
}
|
||||
if (*char_offset == 0) {
|
||||
*char_offset = c_off;
|
||||
while (*char_offset < length &&
|
||||
string[*char_offset] != ' ') {
|
||||
(*char_offset)++;
|
||||
}
|
||||
}
|
||||
}
|
||||
*actual_x = *char_offset * fb_font->width;
|
||||
return true;
|
||||
|
@ -153,17 +153,24 @@ bool nsfont_position_in_string(const plot_font_style_t *fstyle,
|
||||
/**
|
||||
* Find where to split a string to make it fit a width.
|
||||
*
|
||||
* \param fstyle plot style for this text
|
||||
* \param string UTF-8 string to measure
|
||||
* \param length length of string
|
||||
* \param x width available
|
||||
* \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
|
||||
* \param fstyle style for this text
|
||||
* \param string UTF-8 string to measure
|
||||
* \param length length of string, in bytes
|
||||
* \param x width available
|
||||
* \param char_offset updated to offset in string of actual_x, [1..length]
|
||||
* \param actual_x updated to x coordinate of character closest to x
|
||||
* \return true on success, false on error and error reported
|
||||
*
|
||||
* On exit, [char_offset == 0 ||
|
||||
* string[char_offset] == ' ' ||
|
||||
* char_offset == length]
|
||||
* On exit, char_offset indicates first character after split point.
|
||||
*
|
||||
* Note: char_offset of 0 should 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
|
||||
*/
|
||||
|
||||
bool nsfont_split(const plot_font_style_t *fstyle,
|
||||
@ -196,22 +203,7 @@ bool nsfont_split(const plot_font_style_t *fstyle,
|
||||
if (line != NULL) {
|
||||
/* Pango split the text. The line's start_index indicates the
|
||||
* start of the character after the line break. */
|
||||
int orig = index = line->start_index;
|
||||
|
||||
/* We must ensure that the split character is a space so that
|
||||
* we meet the API postcondition. Therefore, scan backwards
|
||||
* through the string and stop when we hit the start of
|
||||
* the string or find a space. */
|
||||
while (index > 0) {
|
||||
if (string[--index] == ' ')
|
||||
break;
|
||||
}
|
||||
|
||||
if (index == 0) {
|
||||
index = orig;
|
||||
while (index != (int)length && string[index] != ' ')
|
||||
index++;
|
||||
}
|
||||
index = line->start_index;
|
||||
}
|
||||
|
||||
g_object_unref(layout);
|
||||
|
@ -59,23 +59,29 @@ static bool nsfont_position_in_string(const plot_font_style_t *fstyle,
|
||||
*
|
||||
* \param fstyle style for this text
|
||||
* \param string UTF-8 string to measure
|
||||
* \param length length of string
|
||||
* \param length length of string, in bytes
|
||||
* \param x width available
|
||||
* \param char_offset updated to offset in string of actual_x, [0..length]
|
||||
* \param char_offset updated to offset in string of actual_x, [1..length]
|
||||
* \param actual_x updated to x coordinate of character closest to x
|
||||
* \return true on success, false on error and error reported
|
||||
*
|
||||
* On exit, [char_offset == 0 ||
|
||||
* string[char_offset] == ' ' ||
|
||||
* char_offset == length]
|
||||
* On exit, char_offset indicates first character after split point.
|
||||
*
|
||||
* Note: char_offset of 0 should 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 bool nsfont_split(const plot_font_style_t *fstyle,
|
||||
const char *string, size_t length,
|
||||
int x, size_t *char_offset, int *actual_x)
|
||||
{
|
||||
|
||||
*char_offset = x / (fstyle->size / FONT_SIZE_SCALE);
|
||||
int c_off = *char_offset = x / (fstyle->size / FONT_SIZE_SCALE);
|
||||
if (*char_offset > length) {
|
||||
*char_offset = length;
|
||||
} else {
|
||||
@ -84,6 +90,12 @@ static bool nsfont_split(const plot_font_style_t *fstyle,
|
||||
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 / FONT_SIZE_SCALE);
|
||||
return true;
|
||||
|
@ -73,13 +73,20 @@ struct font_functions
|
||||
* \param string UTF-8 string to measure
|
||||
* \param length length of string, in bytes
|
||||
* \param x width available
|
||||
* \param char_offset updated to offset in string of actual_x, [0..length]
|
||||
* \param char_offset updated to offset in string of actual_x, [1..length]
|
||||
* \param actual_x updated to x coordinate of character closest to x
|
||||
* \return true on success, false on error and error reported
|
||||
*
|
||||
* On exit, [char_offset == 0 ||
|
||||
* string[char_offset] == ' ' ||
|
||||
* char_offset == length]
|
||||
* On exit, char_offset indicates first character after split point.
|
||||
*
|
||||
* Note: char_offset of 0 should 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
|
||||
*/
|
||||
bool (*font_split)(const plot_font_style_t *fstyle,
|
||||
const char *string, size_t length,
|
||||
|
@ -2164,20 +2164,21 @@ static bool layout_text_box_split(html_content *content,
|
||||
int space_width = split_box->space;
|
||||
struct box *c2;
|
||||
const struct font_functions *font_func = content->font_func;
|
||||
bool space = (split_box->text[new_length] == ' ');
|
||||
int used_length = new_length + (space ? 1 : 0);
|
||||
|
||||
if (space_width == 0) {
|
||||
/* Currently split_box has no space. */
|
||||
/* Get the space width because the split_box will need it */
|
||||
/* Don't set it in split_box yet, or it will get cloned. */
|
||||
if ((space && space_width == 0) || space_width == UNKNOWN_WIDTH) {
|
||||
/* We're need to add a space, and we don't know how big
|
||||
* it's to be, OR we have a space of unknown width anyway;
|
||||
* Calculate space width */
|
||||
font_func->font_width(fstyle, " ", 1, &space_width);
|
||||
} else if (space_width == UNKNOWN_WIDTH) {
|
||||
/* Split_box has a space but its width is unknown. */
|
||||
/* Get the space width because the split_box will need it */
|
||||
/* Set it in split_box, so it gets cloned. */
|
||||
font_func->font_width(fstyle, " ", 1, &space_width);
|
||||
split_box->space = space_width;
|
||||
}
|
||||
|
||||
if (split_box->space == UNKNOWN_WIDTH)
|
||||
split_box->space = space_width;
|
||||
if (!space)
|
||||
space_width = 0;
|
||||
|
||||
/* Create clone of split_box, c2 */
|
||||
c2 = talloc_memdup(content->bctx, split_box, sizeof *c2);
|
||||
if (!c2)
|
||||
@ -2190,18 +2191,18 @@ static bool layout_text_box_split(html_content *content,
|
||||
/* TODO: Move text inputs to core textarea widget and remove
|
||||
* this */
|
||||
c2->text = talloc_strndup(content->bctx,
|
||||
split_box->text + new_length + 1,
|
||||
split_box->length - (new_length + 1));
|
||||
split_box->text + used_length,
|
||||
split_box->length - used_length);
|
||||
if (!c2->text)
|
||||
return false;
|
||||
} else {
|
||||
c2->text += new_length + 1;
|
||||
c2->text += used_length;
|
||||
}
|
||||
|
||||
/* Set c2 according to the remaining text */
|
||||
c2->width -= new_width + space_width;
|
||||
c2->flags &= ~MEASURED; /* width has been estimated */
|
||||
c2->length = split_box->length - (new_length + 1);
|
||||
c2->length = split_box->length - used_length;
|
||||
|
||||
/* Update split_box for its reduced text */
|
||||
split_box->width = new_width;
|
||||
@ -2217,7 +2218,14 @@ static bool layout_text_box_split(html_content *content,
|
||||
c2->next->prev = c2;
|
||||
else
|
||||
c2->parent->last = c2;
|
||||
|
||||
#ifdef LAYOUT_DEBUG
|
||||
LOG(("split_box %p len: %u \"%.*s\"",
|
||||
split_box, split_box->length,
|
||||
split_box->length, split_box->text));
|
||||
LOG((" new_box %p len: %u \"%.*s\"",
|
||||
c2, c2->length,
|
||||
c2->length, c2->text));
|
||||
#endif
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -2713,8 +2721,7 @@ bool layout_line(struct box *first, int *width, int *y,
|
||||
|
||||
if (x1 - x0 < x && split_box) {
|
||||
/* the last box went over the end */
|
||||
unsigned int i;
|
||||
size_t space = 0;
|
||||
size_t split = 0;
|
||||
int w;
|
||||
bool no_wrap = css_computed_white_space(
|
||||
split_box->style) == CSS_WHITE_SPACE_NOWRAP ||
|
||||
@ -2723,56 +2730,45 @@ bool layout_line(struct box *first, int *width, int *y,
|
||||
|
||||
x = x_previous;
|
||||
|
||||
if ((split_box->type == BOX_INLINE ||
|
||||
if (!no_wrap && (split_box->type == BOX_INLINE ||
|
||||
split_box->type == BOX_TEXT) &&
|
||||
!split_box->object &&
|
||||
!(split_box->flags & REPLACE_DIM) &&
|
||||
!(split_box->flags & IFRAME) &&
|
||||
!split_box->gadget && split_box->text) {
|
||||
/* skip leading spaces, otherwise code gets fooled into
|
||||
* thinking it's all one long word */
|
||||
for (i = 0; i != split_box->length &&
|
||||
split_box->text[i] == ' '; i++)
|
||||
;
|
||||
/* find end of word */
|
||||
for (; i != split_box->length &&
|
||||
split_box->text[i] != ' '; i++)
|
||||
;
|
||||
if (i != split_box->length)
|
||||
space = i;
|
||||
}
|
||||
|
||||
/* space != 0 implies split_box->text != 0 */
|
||||
|
||||
if (space == 0 || no_wrap)
|
||||
w = split_box->width;
|
||||
else {
|
||||
font_plot_style_from_css(split_box->style, &fstyle);
|
||||
/** \todo handle errors */
|
||||
font_func->font_width(&fstyle, split_box->text,
|
||||
space, &w);
|
||||
font_func->font_split(&fstyle,
|
||||
split_box->text, split_box->length,
|
||||
x1 - x0 - x - space_before, &split, &w);
|
||||
}
|
||||
|
||||
/* split == 0 implies that text can't be split */
|
||||
|
||||
if (split == 0)
|
||||
w = split_box->width;
|
||||
|
||||
#ifdef LAYOUT_DEBUG
|
||||
LOG(("splitting: split_box %p \"%.*s\", space %zu, w %i, "
|
||||
LOG(("splitting: split_box %p \"%.*s\", spilt %zu, w %i, "
|
||||
"left %p, right %p, inline_count %u",
|
||||
split_box, (int) split_box->length,
|
||||
split_box->text, space, w,
|
||||
split_box->text, split, w,
|
||||
left, right, inline_count));
|
||||
#endif
|
||||
|
||||
if ((space == 0 || x1 - x0 <= x + space_before + w) &&
|
||||
if ((split == 0 || x1 - x0 <= x + space_before + w) &&
|
||||
!left && !right && inline_count == 1) {
|
||||
/* first word of box doesn't fit, but no floats and
|
||||
* first box on line so force in */
|
||||
if (space == 0 || no_wrap) {
|
||||
if (split == 0 || split == split_box->length) {
|
||||
/* only one word in this box, or not text
|
||||
* or white-space:nowrap */
|
||||
b = split_box->next;
|
||||
} else {
|
||||
/* cut off first word for this line */
|
||||
if (!layout_text_box_split(content, &fstyle,
|
||||
split_box, space, w))
|
||||
split_box, split, w))
|
||||
return false;
|
||||
b = split_box->next;
|
||||
}
|
||||
@ -2780,7 +2776,7 @@ bool layout_line(struct box *first, int *width, int *y,
|
||||
#ifdef LAYOUT_DEBUG
|
||||
LOG(("forcing"));
|
||||
#endif
|
||||
} else if ((space == 0 || x1 - x0 <= x + space_before + w) &&
|
||||
} else if ((split == 0 || x1 - x0 <= x + space_before + w) &&
|
||||
inline_count == 1) {
|
||||
/* first word of first box doesn't fit, but a float is
|
||||
* taking some of the width so move below it */
|
||||
@ -2807,7 +2803,7 @@ bool layout_line(struct box *first, int *width, int *y,
|
||||
#ifdef LAYOUT_DEBUG
|
||||
LOG(("moving below float"));
|
||||
#endif
|
||||
} else if (space == 0 || x1 - x0 <= x + space_before + w) {
|
||||
} else if (split == 0 || x1 - x0 <= x + space_before + w) {
|
||||
/* first word of box doesn't fit so leave box for next
|
||||
* line */
|
||||
b = split_box;
|
||||
@ -2816,21 +2812,14 @@ bool layout_line(struct box *first, int *width, int *y,
|
||||
#endif
|
||||
} else {
|
||||
/* fit as many words as possible */
|
||||
assert(space != 0);
|
||||
font_plot_style_from_css(split_box->style, &fstyle);
|
||||
/** \todo handle errors */
|
||||
font_func->font_split(&fstyle,
|
||||
split_box->text, split_box->length,
|
||||
x1 - x0 - x - space_before, &space, &w);
|
||||
assert(split != 0);
|
||||
#ifdef LAYOUT_DEBUG
|
||||
LOG(("'%.*s' %i %zu %i", (int) split_box->length,
|
||||
split_box->text, x1 - x0, space, w));
|
||||
split_box->text, x1 - x0, split, w));
|
||||
#endif
|
||||
if (space == 0)
|
||||
space = 1;
|
||||
if (space != split_box->length) {
|
||||
if (split != split_box->length) {
|
||||
if (!layout_text_box_split(content, &fstyle,
|
||||
split_box, space, w))
|
||||
split_box, split, w))
|
||||
return false;
|
||||
b = split_box->next;
|
||||
}
|
||||
|
@ -866,7 +866,7 @@ nl.all.ScaleNorm:Normal
|
||||
en.all.HotlistShowNS:Show hotlist...
|
||||
de.all.HotlistShowNS:Zeige Hotlist...
|
||||
fr.all.HotlistShowNS:Show hotlist...
|
||||
it.all.HotlistShowNS:Mostra segnalibri...
|
||||
it.all.HotlistShowNS:Mostra...
|
||||
nl.all.HotlistShowNS:Show hotlist...
|
||||
|
||||
# Settings menu
|
||||
|
@ -319,15 +319,22 @@ bool nsfont_position_in_string(const plot_font_style_t *fstyle,
|
||||
*
|
||||
* \param fstyle style for this text
|
||||
* \param string UTF-8 string to measure
|
||||
* \param length length of string
|
||||
* \param length length of string, in bytes
|
||||
* \param x width available
|
||||
* \param char_offset updated to offset in string of actual_x, [0..length]
|
||||
* \param char_offset updated to offset in string of actual_x, [1..length]
|
||||
* \param actual_x updated to x coordinate of character closest to x
|
||||
* \return true on success, false on error and error reported
|
||||
*
|
||||
* On exit, [char_offset == 0 ||
|
||||
* string[char_offset] == ' ' ||
|
||||
* char_offset == length]
|
||||
* On exit, char_offset indicates first character after split point.
|
||||
*
|
||||
* Note: char_offset of 0 should 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
|
||||
*/
|
||||
|
||||
bool nsfont_split(const plot_font_style_t *fstyle,
|
||||
|
@ -208,14 +208,22 @@ static bool nsfont_split(const plot_font_style_t *style,
|
||||
const char *string, size_t length,
|
||||
int x, size_t *char_offset, int *actual_x)
|
||||
{
|
||||
int c_off;
|
||||
nsfont_position_in_string(style, string, length, x, char_offset,
|
||||
actual_x);
|
||||
c_off = *char_offset;
|
||||
if (*char_offset == length) {
|
||||
printf("%s %d\n",string, (int)(*char_offset));
|
||||
return true;
|
||||
}
|
||||
while ((string[*char_offset] != ' ') && (*char_offset > 0))
|
||||
(*char_offset)--;
|
||||
if (*char_offset == 0) {
|
||||
*char_offset = c_off;
|
||||
while (*char_offset < length && string[*char_offset] != ' ') {
|
||||
(*char_offset)++;
|
||||
}
|
||||
}
|
||||
nsfont_position_in_string(style, string, *char_offset, x, char_offset,
|
||||
actual_x);
|
||||
return true;
|
||||
|
Loading…
Reference in New Issue
Block a user