int max_x(TextNode * node, int Ender) { max_x_value = 0; for (; node != NULL; node = node->next) { if (Ender == Endtokens) { if (node->type >= Endtokens) return max_x_value; } else if (node->type == Ender) return max_x_value; switch (node->type) { case Lsquarebrace: case Rsquarebrace: case Word: max_x_value = max(max_x_value, node->x + word_width(node)); break; case Verbatim: case Spadsrctxt: max_x_value = max(max_x_value, node->x + verbatim_width(node)); break; case Punctuation: max_x_value = max(max_x_value, node->x + punctuation_width(node)); break; case Dash: max_x_value = max(max_x_value, node->x + width_of_dash(node)); break; case HSpace: max_x_value = max(max_x_value, node->x + (node->data.node != NULL ? atoi(node->data.node->data.text) : 1)); break; case Space: max_x_value = max(max_x_value, node->x + (gTopOfGroupStack->cur_font->max_bounds.width) * (node->data.node != NULL ? atoi(node->data.node->data.text) : 1)); break; case Group: push_group_stack(); break; case BoldFace: bf_top_group(); break; case Emphasize: if (gTopOfGroupStack->cur_font == gRmFont) em_top_group(); else rm_top_group(); break; case It: em_top_group(); break; case Rm: case Sl: case Tt: rm_top_group(); break; case Endgroup: pop_group_stack(); break; case Controlbitmap: case Inputbitmap: if (node->width == -1) insert_bitmap_file(node); max_x_value = max(max_x_value, node->x + node->width); break; case Inputpixmap: if (node->width == -1) insert_pixmap_file(node); max_x_value = max(max_x_value, node->y + node->width); break; default: break; } } return cur_height; }
int text_width(TextNode * node, int Ender) { int twidth = 0, num_words; for (num_words = 0; node != NULL; num_words++, node = node->next) { if (Ender == Endtokens) { if (node->type == Endtokens) return twidth; } else if (node->type == Ender) return twidth; switch (node->type) { case Macro: case Pound: if (node->space && gInLine) twidth += inter_word_space; break; case Punctuation: twidth += punctuation_width(node); break; case Dash: if (gInLine && node->space) twidth += inter_word_space; twidth += width_of_dash(node); break; case Verbatim: case Spadsrctxt: twidth += verbatim_width(node); break; case Lsquarebrace: case Rsquarebrace: case Word: twidth += word_width(node); break; case Box: twidth += 2 * box_space; break; case Link: case Downlink: case Memolink: case Windowlink: case LispMemoLink: case Lispwindowlink: case Lisplink: case Unixlink: case Spadcall: case Spadcallquit: case Qspadcall: case Qspadcallquit: case LispDownLink: case Lispcommand: case Lispcommandquit: case Spadlink: case Spaddownlink: case Spadmemolink: case Unixcommand: case Upbutton: case Returnbutton: case Description: push_active_group(); break; case Endbutton: case Endspadcommand: case Enddescription: pop_group_stack(); break; case Endlink: pop_group_stack(); break; case Inputstring: twidth += input_string_width(node); break; case SimpleBox: case Radiobox: twidth += node->width + ((node->space) ? inter_word_space : 0); break; case Spadcommand: case Spadgraph: push_spad_group(); break; case VSpace: break; case HSpace: twidth += (node->data.node != NULL ? atoi(node->data.node->data.text) : 1); break; case Space: twidth += (gTopOfGroupStack->cur_font->max_bounds.width) * (node->data.node != NULL ? atoi(node->data.node->data.text) : 1); break; case Tab: twidth = (gTopOfGroupStack->cur_font->max_bounds.width) * (node->data.node != NULL ? atoi(node->data.node->data.text) : 1); break; case Table: twidth = gWindow->width - left_margin - right_margin_space; break; case Tableitem: case Group: twidth += (node->space) ? inter_word_space : 0; push_group_stack(); break; case BoldFace: if (node->space) twidth += inter_word_space; bf_top_group(); break; case Emphasize: if (node->space) twidth += inter_word_space; if (gTopOfGroupStack->cur_font == gRmFont) em_top_group(); else rm_top_group(); break; case It: if (node->space) twidth += inter_word_space; em_top_group(); break; case Rm: case Sl: case Tt: if (node->space) twidth += inter_word_space; rm_top_group(); break; case Endgroup: pop_group_stack(); break; case Controlbitmap: case Inputbitmap: if (node->width == -1) insert_bitmap_file(node); twidth += node->width; break; case Inputpixmap: if (node->width == -1) insert_pixmap_file(node); twidth += node->width; break; case Mbox: case Indent: case Endmacro: case Free: case Bound: case Beep: case Item: case Titem: case Beginitems: case Noop: case Endinputbox: case Fi: case Ifcond: case Endif: case Begintitems: case Enditems: case Endtitems: case Endtableitem: case Endtable: case Endparameter: case Endbox: case Endheader: case Endfooter: case Endscrolling: case Endverbatim: case Endspadsrc: break; case Newline: /* WOw, I guess I should ertunr a really big number */ twidth += gWindow->width; break; default: /* * fprintf(stderr, "Unknown nodetype %d in text_width\n", * node->type); */ break; } } return twidth; }
static void compute_ifcond_extent(TextNode *node) { TextNode *condnode = node->data.ifnode->cond; TextNode *tln = gLineNode; int store_x = text_x, store_y = text_y, lh = present_line_height; int then_x, then_y; /* * This routine checks the value of the condition and swaps in the else * or the then depending */ /* * we have to compute the maximum width and height of the rest of the * text and stuff */ push_group_stack(); if (gInLine && node->space) text_x += inter_word_space; compute_text_extent(node->data.ifnode->thennode); then_x = text_x; then_y = text_y; text_x = store_x; text_y = store_y; present_line_height = lh; gLineNode = tln; if (gInLine && node->space) text_x += inter_word_space; compute_text_extent(node->data.ifnode->elsenode); /* Now choose the best one that is biggest and put it into ifnode */ if (then_y > text_y) { node->y = then_y; node->x = then_x; } else if (text_y > then_y) { node->y = text_y; node->x = text_x; } else if (text_x > then_x) { node->y = text_y; node->x = text_x; } else { node->y = then_y; node->x = then_x; } /* restore everything */ text_x = store_x; text_y = store_y; present_line_height = lh; gLineNode = tln; node->width = 0; if_node = node; if (gInLine && node->space) text_x += inter_word_space; if (check_condition(condnode)) { node->next = node->data.ifnode->thennode; } else { node->next = node->data.ifnode->elsenode; } pop_group_stack(); }
void show_text(TextNode *node, int Ender) { /*int twidth, len;*/ /*int otext_x, otext_y, t;*/ /*XFontStruct *old_font;*/ /*int old_color;*/ for (; node != NULL; node = node->next) { switch (node->type) { case 0: case Beginitems: case Begintitems: case Bound: case Center: case Free: case HSpace: case Indent: case Indentrel: case Item: case Macro: case Mbox: case Newline: case Noop: case Par: case Pound: case Rbrace: case Space: case Tab: case Table: case Titem: case VSpace: break; case Dash: case Fi: case Ifcond: if (visible(node->y, node->height)) { if (strlen(node->data.text) > 1) { XDrawLine(gXDisplay, gWindow->fDisplayedWindow, gWindow->fStandardGC, node->x, node->y + gRegionOffset + y_off - gTopOfGroupStack->cur_font->descent - word_off_height, node->x + node->width, node->y + gRegionOffset + y_off - word_off_height - gTopOfGroupStack->cur_font->descent); } else { XDrawString(gXDisplay, gWindow->fDisplayedWindow, gWindow->fStandardGC, node->x, node->y + gRegionOffset - gTopOfGroupStack->cur_font->descent + y_off, node->data.text, 1); } } else { if (above(node->y)) need_scroll_up_button = 1; else if (below(node->y)) need_scroll_down_button = 1; } break; case Lsquarebrace: case Math: case Punctuation: case Rsquarebrace: case Spadsrctxt: case WindowId: case Word: if (visible(node->y, node->height)) XDrawString(gXDisplay, gWindow->fDisplayedWindow, gWindow->fStandardGC, node->x, node->y + gRegionOffset - gTopOfGroupStack->cur_font->descent + y_off, node->data.text, node->width); else { if (above(node->y)) need_scroll_up_button = 1; else if (below(node->y)) need_scroll_down_button = 1; } break; case Verbatim: push_group_stack(); tt_top_group(); if (visible(node->y, node->height)) XDrawString(gXDisplay, gWindow->fDisplayedWindow, gWindow->fStandardGC, node->x, node->y + gRegionOffset - gTopOfGroupStack->cur_font->descent + y_off, node->data.text, node->width); else { if (above(node->y)) need_scroll_up_button = 1; else if (below(node->y)) need_scroll_down_button = 1; } pop_group_stack(); break; case Horizontalline: if (visible(node->y, node->height)) { line_top_group(); XDrawLine(gXDisplay, gWindow->fDisplayedWindow, gWindow->fStandardGC, 0, node->y + gRegionOffset + y_off, gWindow->width, node->y + gRegionOffset + y_off); pop_group_stack(); } else { if (above(node->y)) need_scroll_up_button = 1; else if (below(node->y)) need_scroll_down_button = 1; } break; case Box: if (visible(node->y, node->height)) XDrawRectangle(gXDisplay, gWindow->fDisplayedWindow, gWindow->fStandardGC, node->x, node->y + gRegionOffset + y_off - node->height, node->width, node->height); else { if (above(node->y)) need_scroll_up_button = 1; else if (below(node->y)) need_scroll_down_button = 1; } break; case Downlink: case Link: case LispDownLink: case LispMemoLink: case Lispcommand: case Lispcommandquit: case Lisplink: case Lispwindowlink: case Memolink: case Qspadcall: case Qspadcallquit: case Returnbutton: case Spadcall: case Spadcallquit: case Spaddownlink: case Spadlink: case Spadmemolink: case Unixcommand: case Unixlink: case Upbutton: case Windowlink: if (pix_visible(node->y, node->height)) show_link(node); break; case Spadcommand: case Spadgraph: case Spadsrc: show_spadcommand(node); break; case Pastebutton: if (visible(node->y, node->height)) show_pastebutton(node); break; case Paste: show_paste(node); break; case Group: case Tableitem: push_group_stack(); break; case Controlbitmap: show_image(node, gWindow->fControlGC); break; case Inputbitmap: show_image(node, gWindow->fStandardGC); break; case Inputpixmap: show_image(node, gWindow->fStandardGC); break; case BoldFace: bf_top_group(); break; case Emphasize: if (gTopOfGroupStack->cur_font == gRmFont) em_top_group(); else rm_top_group(); break; case It: em_top_group(); break; case Sl: case Rm: rm_top_group(); break; case Tt: tt_top_group(); break; case Inputstring: show_input(node); break; case Radiobox: case SimpleBox: show_simple_box(node); break; case Beep: LoudBeepAtTheUser(); break; case Description: bf_top_group(); break; case Endspadsrc: case Endspadcommand: gInAxiomCommand = 1; case Endtableitem: case Enddescription: case Endpastebutton: case Endlink: case Endbutton: case Endgroup: pop_group_stack(); case Endverbatim: case Endmath: case Endbox: case Endtable: case Endmbox: case Endparameter: case Endpaste: case Endinputbox: case Endcenter: case Endmacro: case Endif: case Endtitems: case Enditems: /* * Now since I can show specific regions of the text, then at * this point I should check to see if I am the end */ if (node->type == Ender) return; break; case Endfooter: case Endscrolling: case Endheader: case Endtitle: /* * regardless of what ender I have, I always terminate showing * with one of these */ return; default: fprintf(stderr, "Show_text: Unknown Node Type %d\n", node->type); break; } } }
void compute_text_extent(TextNode *node) { for (; node != NULL; node = node->next) { switch (node->type) { case Endpastebutton: endpastebutton_extent(node); break; case Paste: compute_paste_extent(node); break; case Endpaste: if (gInLine) { start_newline(present_line_height, node); text_x = indent; } break; case Pastebutton: compute_pastebutton_extent(node); break; case Ifcond: compute_ifcond_extent(node); break; case Fi: break; case Endif: if (if_node == NULL) { return; } else endif_extent(node); break; case Endcenter: start_newline(present_line_height, node->next); pop_group_stack(); text_x = indent; break; case Pound: case Macro: /* check to see if we had space in front of me, if so add it */ if (node->space && gInLine) text_x += inter_word_space; break; case Punctuation: compute_punctuation_extent(node); break; case Endmath: break; case Endverbatim: if (gInLine) { start_newline(present_line_height, node); text_x = indent; } break; case Spadsrctxt: compute_spadsrctxt_extent(node); break; case Math: compute_word_extent(node); break; case Verbatim: compute_verbatim_extent(node); break; case WindowId: case Word: case Lsquarebrace: case Rsquarebrace: compute_word_extent(node); break; case Dash: compute_dash_extent(node); break; case HSpace: node->height = line_height; node->x = text_x; node->y = text_y; if (gInLine) { text_x += (node->data.node != NULL ? atoi(node->data.node->data.text) : 1); } break; case VSpace: node->height = line_height; node->x = text_x; node->y = text_y + present_line_height;; text_y += (node->data.node != NULL ? atoi(node->data.node->data.text) : 1) + present_line_height; past_line_height = (node->data.node != NULL ? atoi(node->data.node->data.text) : 1) + present_line_height; present_line_height = line_height; break; case Space: node->height = line_height; node->x = text_x; node->y = text_y; text_x += (gTopOfGroupStack->cur_font->max_bounds.width) * (node->data.node != NULL ? atoi(node->data.node->data.text) : 1); break; case Tab: node->height = line_height; text_x = indent + (gTopOfGroupStack->cur_font->max_bounds.width) * (node->data.node != NULL ? atoi(node->data.node->data.text) : 1); gInLine = 0; break; case Par: node->height = line_height; if (gInItem) text_x = indent; else text_x = indent + paragraph_space; if (gInLine) { start_newline(present_line_height, node); } break; case Newline: if (gInLine) { start_newline(present_line_height, node); text_x = indent; } break; case Horizontalline: if (gInLine) { start_newline(present_line_height, node); text_x = indent; } node->height = line_height; gInLine = 0; node->y = text_y - line_height / 2; node->x = text_x; start_newline(present_line_height, node); break; case Center: compute_center_extent(node); break; case Box: compute_box_extent(node); break; case Mbox: compute_mbox_extent(node); break; case Beginitems: case Begintitems: compute_begin_items_extent(node); break; case Enditems: case Endtitems: pop_item_stack(); if (gInLine) { start_newline(present_line_height, node); } text_x = indent; break; case Titem: if (gInLine) { start_newline(present_line_height, node); } text_x = indent - item_space; break; case Item: compute_item_extent(node); break; case Mitem: compute_mitem_extent(node); break; case Upbutton: case Returnbutton: case Memolink: case Downlink: case Link: case Windowlink: compute_button_extent(node); break; case Unixlink: case Lisplink: case Lispwindowlink: case Spadcall: case Spadcallquit: case Qspadcall: case Qspadcallquit: case LispDownLink: case LispMemoLink: case Lispcommand: case Lispcommandquit: case Spadlink: case Spaddownlink: case Spadmemolink: case Unixcommand: compute_button_extent(node); break; case Endbutton: endbutton_extent(node); break; case Endlink: if (link_node == NULL) return; else endbutton_extent(node); break; case Spadsrc: compute_spadsrc_extent(node); break; case Spadcommand: case Spadgraph: compute_spadcommand_extent(node); break; case Endspadsrc: end_spadsrc_extent(node); break; case Endspadcommand: end_spadcommand_extent(node); break; case Indent: indent = left_margin + atoi(node->data.node->data.text) * (gTopOfGroupStack->cur_font->max_bounds.width); if (!gInLine) text_x = indent; break; case Indentrel: indent += atoi(node->data.node->data.text) * (gTopOfGroupStack->cur_font->max_bounds.width); if (!gInLine) text_x = indent; break; case Group: push_group_stack(); node->y = text_y; if (gInLine && node->space) text_x += inter_word_space; break; case Endgroup: pop_group_stack(); break; case Tableitem: push_group_stack(); node->y = text_y; if (gInLine && node->space) text_x += inter_word_space; break; case Endtableitem: pop_group_stack(); return; case Controlbitmap: case Inputbitmap: if (node->width == -1) insert_bitmap_file(node); compute_image_extent(node); break; case Inputpixmap: if (node->width == -1) insert_pixmap_file(node); compute_image_extent(node); break; case Table: compute_table_extent(&node); break; case BoldFace: compute_bf_extent(node); break; case Emphasize: compute_em_extent(node); break; case It: compute_it_extent(node); break; case Rm: case Sl: case Tt: compute_rm_extent(node); break; case Inputstring: compute_input_extent(node); break; case SimpleBox: case Radiobox: compute_ir_extent(node); break; case Endbox: text_x += box_width; break; case Endmacro: case Endparameter: break; case Description: bf_top_group(); break; case Enddescription: pop_group_stack(); if (gInDesc) return; break; case Endscrolling: /* * What we should do here is if we am in the middle of a line, we * should end it here an now. */ if (gInLine) start_newline(present_line_height, node); break; case Noop: noop_count++; break; case Endinputbox: case Endheader: case Endtitle: case Endfooter: case Rbrace: case Free: case Bound: case Beep: case 0: break; default: fprintf(stderr, "Compute_text_extent: Unknown node type %d\n", node->type); break; } } }