# HG changeset patch # User Todd Kulesza # Date 970979374 0 # Node ID 0f9fc69a1f3ba528418e70e28287c5fd54c5dbd4 # Parent 889e5026fd985675333f3c920ce5ff0ff8d5912c [gaim-migrate @ 966] gdb is a wonderful tool ;) committer: Tailor Script diff -r 889e5026fd98 -r 0f9fc69a1f3b src/gtkhtml.c --- a/src/gtkhtml.c Sun Oct 08 01:52:44 2000 +0000 +++ b/src/gtkhtml.c Sun Oct 08 04:29:34 2000 +0000 @@ -44,7 +44,7 @@ #include "pixmaps/admin_icon.xpm" #include "pixmaps/free_icon.xpm" #include "pixmaps/dt_icon.xpm" -#define MAX_SIZE 7 +#define MAX_SIZE 7 #define MIN_HTML_WIDTH_LINES 20 #define MIN_HTML_HEIGHT_LINES 10 #define BORDER_WIDTH 2 @@ -53,6 +53,7 @@ #define KEY_SCROLL_PIXELS 10 int font_sizes[] = { 80, 100, 120, 140, 200, 300, 400 }; +GtkHtmlBit *start_of_line = NULL; /* GdkFont *fixed_font[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL }; @@ -168,7 +169,8 @@ static void draw_cursor(GtkHtml * html); static void undraw_cursor(GtkHtml * html); -static int get_line_height(GtkHtml *, GtkHtmlBit *); +static int get_line_max_height(GtkHtml *, GtkHtmlBit *); +static void get_line_max_extents(GtkHtml *, GtkHtmlBit *, int *, int *); static GtkWidgetClass *parent_class = NULL; @@ -1844,8 +1846,6 @@ if (html->frozen > 0) return; - hbits = g_list_find(html->html_bits, hb); - if (hb->type == HTML_BIT_TEXT) { @@ -2046,22 +2046,43 @@ /*end my stuff*/ if (hb->text && hb->back != NULL) { - int hwidth, hheight, hei, tmpcnt; - hei = get_line_height(html, hb); + int hwidth, hheight, tmpcnt, max_ascent, max_descent; + + /* get the gtkhtmlbit at the start of each line, and use it as the starting point to calculate the + max height of each line and set the background-rectangle's size accordingly */ + /* FIXME: should also include a method of eliminating 'gaps' between different line using + different text sizes */ + if (!start_of_line) + start_of_line = hb; + else + { + hbits = g_list_find(html->html_bits, hb); + if (hbits->prev) + { + hbit = hbits->prev->data; + if (hbit && hbit->newline) + start_of_line = hb; + } + else + start_of_line = hb; + } + + get_line_max_extents(html, start_of_line, &max_ascent, &max_descent); gdk_window_get_size(html->html_area, &hwidth, &hheight); gdk_gc_set_foreground(gc, hb->back); /* we use a 2-pixel window border */ if (hb->x < 2) hb->x = 2; + gdk_draw_rectangle(html->html_area, gc, TRUE /* filled */, - hb->x, hb->y - html->yoffset - hei - 6, - hwidth - shift - hb->x + 1, hei + hei + 2); + hb->x, hb->y - html->yoffset - max_ascent - max_descent - 2, + hwidth - shift - hb->x + 1, max_ascent + max_descent + 8); for (tmpcnt = 1; tmpcnt < hb->newline; tmpcnt++) { - int eoff = hei + hei + 2; + int eoff = max_ascent + max_descent + 2; eoff *= tmpcnt; gdk_draw_rectangle(html->html_area, gc, TRUE, - 2, hb->y - html->yoffset - hei - 6 + eoff, - hwidth, hei + hei + 2); + 2, hb->y - html->yoffset - max_ascent - max_descent - 2 + eoff, + hwidth, max_ascent + max_descent + 2); } } @@ -2074,6 +2095,7 @@ gdk_draw_string(html->html_area, hb->font, gc, shift + hb->x, hb->y - html->yoffset, hb->text); + if (hb->uline) gdk_draw_line(html->html_area, gc, shift + hb->x, hb->y - html->yoffset, @@ -2092,7 +2114,24 @@ { if (hb->back != NULL) { int hwidth, hheight, hei, tmpcnt; - hei = get_line_height(html, hb); + + if (!start_of_line) + start_of_line = hb; + else + { + hbits = g_list_find(html->html_bits, hb); + if (hbits && hbits->prev) + { + hbit = hbits->prev->data; + if (hbit && hbit->newline) + start_of_line = hb; + } + else + start_of_line = hb; + } + + hei = get_line_max_height(html, start_of_line); + gdk_window_get_size(html->html_area, &hwidth, &hheight); gdk_gc_set_foreground(gc, hb->back); gdk_draw_rectangle(html->html_area, gc, TRUE, @@ -2128,7 +2167,24 @@ clear_area(html, &area); if (hb->back != NULL) { int hwidth, hheight, hei, tmpcnt; - hei = get_line_height(html, hb); + + if (!start_of_line) + start_of_line = hb; + else + { + hbits = g_list_find(html->html_bits, hb); + if (hbits && hbits->prev) + { + hbit = hbits->prev->data; + if (hbit && hbit->newline) + start_of_line = hb; + } + else + start_of_line = hb; + } + + hei = get_line_max_height(html, start_of_line); + gdk_window_get_size(html->html_area, &hwidth, &hheight); gdk_gc_set_foreground(gc, hb->back); for (tmpcnt = 0; tmpcnt < hb->newline; tmpcnt++) { @@ -2857,7 +2913,7 @@ GdkGC *gc; int nl = 0, nl2 = 0; - int maxwidth; + int maxwidth, ascent, descent; gint lb; GList *hbits; size_t num = 0; @@ -2975,7 +3031,8 @@ if (!count) { /* FIXME : sometimes we need to add newline, sometimes we don't */ hbits = g_list_last(html->html_bits); - if (!hbits) return; /* does this ever happen? */ + if (!hbits) + return; /* does this ever happen? */ hb = (GtkHtmlBit *)hbits->data; hb->newline++; } @@ -3005,9 +3062,9 @@ } - height = cfont->ascent + cfont->descent + 2; - - + gdk_text_extents(cfont, "yG", strlen("yG"), NULL, NULL, NULL, &ascent, &descent); + height = ascent + descent + 2; + if ((int) (html->vadj->upper - html->current_y) < (int) (height * 2)) { int val; @@ -3019,7 +3076,7 @@ if (html->current_x == 0) { - html->current_y += height + 3; + html->current_y += height + 6; gdk_text_extents(cfont, text, 1, &lb, NULL, NULL, NULL, NULL); html->current_x += (2 - lb); } @@ -3431,9 +3488,7 @@ { d += strlen("COLOR="); if (*d == '\"') - { d++; - } if (*d == '#') d++; if (d[strlen(d) - 1] == '\"') @@ -3444,17 +3499,12 @@ current->color = get_color(colorv, map); current->owncolor = 1; } - else - { - } } if (!strncasecmp(d, "FACE=", strlen("FACE="))) { d += strlen("FACE="); if (*d == '\"') - { d++; - } if (d[strlen(d) - 1] == '\"') d[strlen(d) - 1] = 0; strcpy(current->font, d); @@ -3474,9 +3524,6 @@ current->bgcol = get_color(colorv, map); current->ownbg = 1; } - else - { - } } else if (!strncasecmp(d, "SIZE=", strlen("SIZE="))) { @@ -3486,12 +3533,7 @@ if (*d == '+') d++; if (sscanf(d, "%d", &colorv)) - { current->size = colorv; - } - else - { - } } else if (strncasecmp(d, "PTSIZE=", strlen("PTSIZE="))) { @@ -3500,7 +3542,6 @@ } else if (!strncasecmp(tag, "BODY", strlen("BODY"))) { - char *d; current = push_state(current); html_strtok(tag, ' '); @@ -4391,7 +4432,7 @@ } } -static int get_line_height(GtkHtml *html, GtkHtmlBit *start) +static int get_line_max_height(GtkHtml *html, GtkHtmlBit *start) { int height, max_height = 0; GList *hbits = html->html_bits; @@ -4401,7 +4442,7 @@ while (hbits) { - hbit = hbits->data; + hbit = (GtkHtmlBit *)hbits->data; if (hbit->font) height = gdk_text_height(hbit->font, "C", 1); @@ -4412,8 +4453,42 @@ hbits = hbits->next; } - if (max_height == 0) + if (!max_height) max_height = gdk_text_height(hbit->font, "C", 1); - + return max_height; } + +static void get_line_max_extents(GtkHtml *html, GtkHtmlBit *start, int *max_acsent, int *max_descent) +{ + int acsent, descent; + GList *hbits = html->html_bits; + GtkHtmlBit *hbit = start; /* default this in case hbits is NULL */ + + *max_acsent = 0; + *max_descent = 0; + + hbits = g_list_find(hbits, start); + + while (hbits) + { + hbit = (GtkHtmlBit *)hbits->data; + if (hbit->font) + gdk_text_extents(hbit->font, "yG", strlen("yG"), NULL, NULL, NULL, &acsent, &descent); + + if (*max_acsent < acsent) + *max_acsent = acsent; + if (*max_descent < descent) + *max_descent =descent; + if (hbit->newline) + break; + hbits = hbits->next; + } + + if (!*max_acsent) + gdk_text_extents(hbit->font, "yG", strlen("yG"), NULL, NULL, NULL, max_acsent, NULL); + if (!*max_descent) + gdk_text_extents(hbit->font, "yG", strlen("yG"), NULL, NULL, NULL, NULL, max_descent); + + return; +} \ No newline at end of file