From 50fc20c2d4883b399fcee8c7a2905605304d9e40 Mon Sep 17 00:00:00 2001 From: Phil Mellor Date: Sun, 29 Dec 2002 22:27:35 +0000 Subject: [project @ 2002-12-29 22:27:35 by monkeyson] Font anti-alias colours corrected. Begin displaying form elements - text, password, submit, reset svn path=/import/netsurf/; revision=71 --- desktop/browser.c | 15 +++++++++- desktop/netsurf.c | 4 +-- render/box.c | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- render/box.h | 18 +++++++++++- render/layout.c | 74 ++++++++++++++++++++++++++++++++++++++++++------ riscos/font.c | 4 +-- riscos/gui.c | 63 +++++++++++++++++++++++++++++++++++------ 7 files changed, 240 insertions(+), 23 deletions(-) diff --git a/desktop/browser.c b/desktop/browser.c index 968282fdb..a52562a4e 100644 --- a/desktop/browser.c +++ b/desktop/browser.c @@ -1,5 +1,5 @@ /** - * $Id: browser.c,v 1.16 2002/12/25 22:59:21 bursa Exp $ + * $Id: browser.c,v 1.17 2002/12/29 22:27:35 monkeyson Exp $ */ #include "netsurf/riscos/font.h" @@ -684,10 +684,18 @@ void browser_window_text_selection(struct browser_window* bw, start = &(bw->current_content->data.html.text_selection.start); end = &(bw->current_content->data.html.text_selection.end); + if (click_boxes[i].box->font != 0) + { font_position_in_string(click_boxes[i].box->text, click_boxes[i].box->font, click_boxes[i].box->length, click_x - click_boxes[i].actual_x, &click_char_offset, &click_pixel_offset); + } + else + { + click_char_offset = 0; + click_pixel_offset = 0; + } new_pos.box = click_boxes[i].box; new_pos.actual_box_x = click_boxes[i].actual_x; @@ -989,5 +997,10 @@ char *url_join(const char* new, const char* base) } LOG(("ret = %s", ret)); + if (ret == NULL) + { + ret = xcalloc(strlen(new) + 10, sizeof(char)); + strcpy(ret, new); + } return ret; } diff --git a/desktop/netsurf.c b/desktop/netsurf.c index e92dea016..144d9fa7d 100644 --- a/desktop/netsurf.c +++ b/desktop/netsurf.c @@ -1,5 +1,5 @@ /** - * $Id: netsurf.c,v 1.4 2002/11/03 09:39:53 bursa Exp $ + * $Id: netsurf.c,v 1.5 2002/12/29 22:27:35 monkeyson Exp $ */ #include "netsurf/desktop/netsurf.h" @@ -51,7 +51,7 @@ int main(int argc, char** argv) void Log(char* func, char* msg) { -#ifdef NETSURF_DUMP +#ifdef NETSURF_DUMP_MONKEYS FILE* logfile = NULL; logfile = fopen("logfile","a"); if (logfile == NULL) diff --git a/render/box.c b/render/box.c index 59a32016f..5fc1aa355 100644 --- a/render/box.c +++ b/render/box.c @@ -1,5 +1,5 @@ /** - * $Id: box.c,v 1.22 2002/12/27 20:35:32 bursa Exp $ + * $Id: box.c,v 1.23 2002/12/29 22:27:35 monkeyson Exp $ */ #include @@ -19,6 +19,8 @@ * internal functions */ +struct box* box_gui_gadget(xmlNode * n, struct css_style* style); + void box_add_child(struct box * parent, struct box * child); struct box * box_create(xmlNode * node, box_type type, struct css_style * style, const char *href); @@ -77,6 +79,7 @@ struct box * box_create(xmlNode * node, box_type type, struct css_style * style, box->next_float = 0; box->col = 0; box->font = 0; + box->gadget = 0; return box; } @@ -173,6 +176,7 @@ struct box * convert_xml_to_box(xmlNode * n, struct css_style * parent_style, } if (n->type == XML_TEXT_NODE || + (n->type == XML_ELEMENT_NODE && (strcmp((const char *) n->name, "input") == 0)) || (n->type == XML_ELEMENT_NODE && (style->float_ == CSS_FLOAT_LEFT || style->float_ == CSS_FLOAT_RIGHT))) { /* text nodes are converted to inline boxes, wrapped in an inline container block */ @@ -194,6 +198,11 @@ struct box * convert_xml_to_box(xmlNode * n, struct css_style * parent_style, } box->font = font_open(fonts, box->style); box_add_child(inline_container, box); + } else if (strcmp((const char *) n->name, "input") == 0) { + LOG(("input")); + box = box_gui_gadget(n, parent_style); + if (box != NULL) + box_add_child(inline_container, box); } else { LOG(("float")); box = box_create(0, BOX_FLOAT_LEFT, 0, href); @@ -406,6 +415,7 @@ void box_normalise_block(struct box *block) assert(block->type == BOX_BLOCK || block->type == BOX_TABLE_CELL); for (child = block->children; child != 0; prev_child = child, child = child->next) { + fprintf(stderr, "child->type = %d\n", child->type); switch (child->type) { case BOX_BLOCK: /* ok */ @@ -702,6 +712,12 @@ void box_free(struct box *box) /* last this box */ // if (box->style != 0) // free(box->style); + if (box->gadget != 0) + { + /* gadget_free(box->gadget); */ + free((void*)box->gadget); + } + if (box->text != 0) free((void*)box->text); /* only free href if we're the top most user */ @@ -713,3 +729,70 @@ void box_free(struct box *box) free((void*)box->href); } } + +struct box* box_gui_gadget(xmlNode * n, struct css_style* style) +{ + struct box* box = 0; + char* s; + char* type; + + if ((type = (char *) xmlGetProp(n, (xmlChar *) "type"))) + { + if (strcmp(type, "submit") == 0 || strcmp(type, "reset") == 0) + { + //style->display = CSS_DISPLAY_BLOCK; + + box = box_create(n, BOX_INLINE, style, NULL); + box->gadget = xcalloc(1, sizeof(struct gui_gadget)); + box->gadget->type = GADGET_ACTIONBUTTON; + + box->text = 0; + box->length = 0; + box->font = 0; + + if ((s = (char *) xmlGetProp(n, (xmlChar *) "value"))) { + box->gadget->data.actionbutt.label = s; + } + else + { + box->gadget->data.actionbutt.label = strdup(type); + box->gadget->data.actionbutt.label[0] = toupper(type[0]); + } + } + if (strcmp(type, "text") == 0 || strcmp(type, "password") == 0) + { + //style->display = CSS_DISPLAY_BLOCK; + + box = box_create(n, BOX_INLINE, style, NULL); + box->gadget = xcalloc(1, sizeof(struct gui_gadget)); + box->gadget->type = GADGET_TEXTBOX; + + box->text = 0; + box->length = 0; + box->font = 0; + + box->gadget->data.textbox.maxlength = 255; + if ((s = (char *) xmlGetProp(n, (xmlChar *) "maxlength"))) { + box->gadget->data.textbox.maxlength = atoi(s); + free(s); + } + + box->gadget->data.textbox.size = box->gadget->data.textbox.maxlength; + if ((s = (char *) xmlGetProp(n, (xmlChar *) "size"))) { + box->gadget->data.textbox.size = atoi(s); + free(s); + } + + box->gadget->data.textbox.text = xcalloc(box->gadget->data.textbox.maxlength + 1, sizeof(char)); + + if ((s = (char *) xmlGetProp(n, (xmlChar *) "value"))) { + strncpy(box->gadget->data.textbox.text, s, + box->gadget->data.textbox.maxlength); + free(s); + } + + } + free(type); + } + return box; +} diff --git a/render/box.h b/render/box.h index ad5290d34..05f7ffeb8 100644 --- a/render/box.h +++ b/render/box.h @@ -1,5 +1,5 @@ /** - * $Id: box.h,v 1.12 2002/12/27 17:28:19 bursa Exp $ + * $Id: box.h,v 1.13 2002/12/29 22:27:35 monkeyson Exp $ */ #ifndef _NETSURF_RENDER_BOX_H_ @@ -27,6 +27,21 @@ struct column { unsigned long min, max, width; }; +struct gui_gadget { + enum { GADGET_HIDDEN = 0, GADGET_TEXTBOX, GADGET_RADIO, GADGET_OPTION, + GADGET_COMBO, GADGET_LIST, GADGET_TEXTAREA, GADGET_ACTIONBUTTON } type; + union { + struct { + int maxlength; + char* text; + int size; + } textbox; + struct { + char* label; + } actionbutt; + } data; +}; + struct box { box_type type; xmlNode * node; @@ -46,6 +61,7 @@ struct box { struct box * next_float; struct column *col; struct font_data *font; + struct gui_gadget* gadget; }; #define UNKNOWN_WIDTH ULONG_MAX diff --git a/render/layout.c b/render/layout.c index e136a009a..62cb25f0e 100644 --- a/render/layout.c +++ b/render/layout.c @@ -1,5 +1,5 @@ /** - * $Id: layout.c,v 1.27 2002/12/27 22:29:45 bursa Exp $ + * $Id: layout.c,v 1.28 2002/12/29 22:27:35 monkeyson Exp $ */ #include @@ -107,6 +107,35 @@ void layout_node(struct box * box, unsigned long width, struct box * cont, } } + + +int gadget_width(struct gui_gadget* gadget) +{ + switch (gadget->type) + { + case GADGET_TEXTBOX: + return gadget->data.textbox.size * 8; + case GADGET_ACTIONBUTTON: + return strlen(gadget->data.actionbutt.label) * 8 + 16; + default: + assert(0); + } + return 0; +} + +int gadget_height(struct gui_gadget* gadget) +{ + switch (gadget->type) + { + case GADGET_TEXTBOX: + return 28; + case GADGET_ACTIONBUTTON: + return 28; + default: + assert(0); + } + return 0; +} /** * layout_block -- position block and recursively layout children * @@ -300,18 +329,31 @@ struct box * layout_line(struct box * first, unsigned long width, unsigned long find_sides(cont->float_children, cy, cy, &x0, &x1, &left, &right); /* get minimum line height from containing block */ - height = line_height(first->parent->parent->style); + if (first->text != 0) + height = line_height(first->parent->parent->style); + else if (first->gadget != 0) + height = gadget_height(first->gadget); /* pass 1: find height of line assuming sides at top of line */ for (x = 0, b = first; x < x1 - x0 && b != 0; b = b->next) { assert(b->type == BOX_INLINE || b->type == BOX_FLOAT_LEFT || b->type == BOX_FLOAT_RIGHT); if (b->type == BOX_INLINE) { - h = line_height(b->style ? b->style : b->parent->parent->style); + if (b->text != 0) + h = line_height(b->style ? b->style : b->parent->parent->style); + else if (b->gadget != 0) + h = gadget_height(b->gadget); + b->height = h; if (h > height) height = h; - if (b->width == UNKNOWN_WIDTH) + if (b->width == UNKNOWN_WIDTH && b->font != 0) b->width = font_width(b->font, b->text, b->length); - x += b->width + b->space ? b->font->space_width : 0; + else if (b->width == UNKNOWN_WIDTH && b->gadget != 0) + b->width = gadget_width(b->gadget); + + if (b->font != 0) + x += b->width + b->space ? b->font->space_width : 0; + else if (b->gadget != 0) + x += b->width; } } @@ -328,7 +370,10 @@ struct box * layout_line(struct box * first, unsigned long width, unsigned long b->x = x; x += b->width; space_before = space_after; - space_after = b->space ? b->font->space_width : 0; + if (b->font != 0) + space_after = b->space ? b->font->space_width : 0; + else + space_after = 0; c = b; move_y = 1; /* fprintf(stderr, "layout_line: '%.*s' %li %li\n", b->length, b->text, xp, x); */ @@ -378,8 +423,10 @@ struct box * layout_line(struct box * first, unsigned long width, unsigned long if (space == 0) w = c->width; - else + else if (c->font != 0) w = font_width(c->font, c->text, space - c->text); + else if (c->gadget != 0) + w = gadget_width(c->gadget); if (x1 - x0 < x + space_before + w && left == 0 && right == 0 && c == first) { /* first word doesn't fit, but no floats and first on line so force in */ @@ -405,7 +452,7 @@ struct box * layout_line(struct box * first, unsigned long width, unsigned long /* first word doesn't fit, but full width not available so leave for later */ b = c; /* fprintf(stderr, "layout_line: overflow, leaving\n"); */ - } else { + } else if (c->text != 0) { /* fit as many words as possible */ assert(space != 0); space = font_split(c->font, c->text, c->length, @@ -669,8 +716,11 @@ void calculate_inline_container_widths(struct box *box) switch (child->type) { case BOX_INLINE: /* max = all one line */ + if (child->font != 0) + { child->width = font_width(child->font, child->text, child->length); + max += child->width; /* min = widest word */ @@ -682,6 +732,14 @@ void calculate_inline_container_widths(struct box *box) } width = font_width(child->font, word, strlen(word)); if (min < width) min = width; + } + else if (child->gadget != 0) + { + child->width = gadget_width(child->gadget); + max += child->width; + if (min < child->width) + min = child->width; + } break; case BOX_FLOAT_LEFT: diff --git a/riscos/font.c b/riscos/font.c index 9fc4d0e9c..966e24688 100644 --- a/riscos/font.c +++ b/riscos/font.c @@ -1,5 +1,5 @@ /** - * $Id: font.c,v 1.8 2002/12/27 17:28:19 bursa Exp $ + * $Id: font.c,v 1.9 2002/12/29 22:27:35 monkeyson Exp $ */ #include @@ -68,7 +68,7 @@ void font_position_in_string(const char* text, struct font_data* font, block.letter.x = block.letter.y = 0; block.split_char = -1; - xfont_scan_string(font, text, + xfont_scan_string(font->handle, text, font_GIVEN_BLOCK | font_GIVEN_FONT | font_KERN | font_RETURN_CARET_POS | font_GIVEN_LENGTH, ro_x_units(x) * 400, 0x7fffffff, diff --git a/riscos/gui.c b/riscos/gui.c index 45b9ae8b5..04b6e10d1 100644 --- a/riscos/gui.c +++ b/riscos/gui.c @@ -1,5 +1,5 @@ /** - * $Id: gui.c,v 1.9 2002/12/29 20:02:46 bursa Exp $ + * $Id: gui.c,v 1.10 2002/12/29 22:27:35 monkeyson Exp $ */ #include "netsurf/riscos/font.h" @@ -12,8 +12,10 @@ #include #include +int gadget_subtract_x; +int gadget_subtract_y; #define browser_menu_flags (wimp_ICON_TEXT | wimp_ICON_FILLED | (wimp_COLOUR_BLACK << wimp_ICON_FG_COLOUR_SHIFT) | (wimp_COLOUR_WHITE << wimp_ICON_BG_COLOUR_SHIFT)) -#define HOME_URL "file://Resources/intro.html" +char* HOME_URL = "file://Resources/intro.html\0"; wimp_MENU(2) netsurf_iconbar_menu = { @@ -243,6 +245,7 @@ int window_y_units(int scr_units, wimp_window_state* win) return scr_units - (win->visible.y1 - win->yscroll); } + gui_window* create_gui_browser_window(struct browser_window* bw) { struct wimp_window window; @@ -458,7 +461,7 @@ gui_safety gui_window_set_redraw_safety(gui_window* g, gui_safety s) int select_on = 0; -void ro_gui_window_redraw_box(gui_window* g, struct box * box, signed long x, signed long y, os_box* clip) +void ro_gui_window_redraw_box(gui_window* g, struct box * box, signed long x, signed long y, os_box* clip, int current_background_color) { struct box * c; const char * const noname = ""; @@ -500,9 +503,50 @@ void ro_gui_window_redraw_box(gui_window* g, struct box * box, signed long x, si colourtrans_set_gcol(box->style->background_color << 8, 0, os_ACTION_OVERWRITE, 0); os_plot(os_MOVE_TO, x + box->x * 2, y - box->y * 2); os_plot(os_PLOT_RECTANGLE | os_PLOT_BY, box->width * 2, -box->height * 2); + current_background_color = box->style->background_color; + } + + if (box->gadget != 0) + { + wimp_icon icon; + fprintf(stderr, "writing GADGET\n"); + + icon.extent.x0 = -gadget_subtract_x + x + box->x * 2; + icon.extent.y0 = -gadget_subtract_y + y - box->y * 2 - box->height * 2; + icon.extent.x1 = -gadget_subtract_x + x + box->x * 2 + box->width * 2; + icon.extent.y1 = -gadget_subtract_y + y - box->y * 2; + + switch (box->gadget->type) + { + case GADGET_TEXTBOX: + icon.flags = wimp_ICON_TEXT | wimp_ICON_BORDER | + wimp_ICON_VCENTRED | wimp_ICON_FILLED | + wimp_ICON_INDIRECTED | + (wimp_COLOUR_BLACK << wimp_ICON_FG_COLOUR_SHIFT) | + (wimp_COLOUR_WHITE << wimp_ICON_BG_COLOUR_SHIFT); + icon.data.indirected_text.text = box->gadget->data.textbox.text; + icon.data.indirected_text.size = box->gadget->data.textbox.maxlength; + icon.data.indirected_text.validation = " "; + fprintf(stderr, "writing GADGET TEXTBOX\n"); + wimp_plot_icon(&icon); + break; + + case GADGET_ACTIONBUTTON: + icon.flags = wimp_ICON_TEXT | wimp_ICON_BORDER | + wimp_ICON_VCENTRED | wimp_ICON_FILLED | + wimp_ICON_INDIRECTED | wimp_ICON_HCENTRED | + (wimp_COLOUR_BLACK << wimp_ICON_FG_COLOUR_SHIFT) | + (wimp_COLOUR_VERY_LIGHT_GREY << wimp_ICON_BG_COLOUR_SHIFT); + icon.data.indirected_text.text = box->gadget->data.actionbutt.label; + icon.data.indirected_text.size = strlen(box->gadget->data.actionbutt.label); + icon.data.indirected_text.validation = "R5,3"; + fprintf(stderr, "writing GADGET ACTION\n"); + wimp_plot_icon(&icon); + break; + } } - if (box->type == BOX_INLINE) + if (box->type == BOX_INLINE && box->font != 0) { if (g->data.browser.bw->current_content->data.html.text_selection.selected == 1) @@ -515,6 +559,7 @@ if (g->data.browser.bw->current_content->data.html.text_selection.selected == 1) if (start->box == box) { + fprintf(stderr, "THE START OFFSET IS %d\n", start->pixel_offset * 2); if (end->box == box) { colourtrans_set_gcol(os_COLOUR_VERY_LIGHT_GREY, colourtrans_SET_FG, 0, 0); @@ -563,7 +608,7 @@ if (g->data.browser.bw->current_content->data.html.text_selection.selected == 1) } } - colourtrans_set_font_colours(box->font->handle, 0xffffff, box->style->color << 8, + colourtrans_set_font_colours(box->font->handle, current_background_color << 8, box->style->color << 8, 14, 0, 0, 0); font_paint(box->font->handle, box->text, @@ -593,10 +638,10 @@ if (g->data.browser.bw->current_content->data.html.text_selection.selected == 1) for (c = box->children; c != 0; c = c->next) if (c->type != BOX_FLOAT_LEFT && c->type != BOX_FLOAT_RIGHT) - ro_gui_window_redraw_box(g, c, x + box->x * 2, y - box->y * 2, clip); + ro_gui_window_redraw_box(g, c, x + box->x * 2, y - box->y * 2, clip, current_background_color); for (c = box->float_children; c != 0; c = c->next_float) - ro_gui_window_redraw_box(g, c, x + box->x * 2, y - box->y * 2, clip); + ro_gui_window_redraw_box(g, c, x + box->x * 2, y - box->y * 2, clip, current_background_color); } @@ -638,10 +683,12 @@ void ro_gui_window_redraw(gui_window* g, wimp_draw* redraw) while (more) { + gadget_subtract_x = redraw->box.x0 - redraw->xscroll; + gadget_subtract_y = redraw->box.y1 - redraw->yscroll; ro_gui_window_redraw_box(g, g->data.browser.bw->current_content->data.html.layout->children, redraw->box.x0 - redraw->xscroll, redraw->box.y1 - redraw->yscroll, - &redraw->clip); + &redraw->clip, 0xffffff); more = wimp_get_rectangle(redraw); } return; -- cgit v1.2.3