diff options
author | dos-reis <gdr@axiomatics.org> | 2008-03-07 15:19:01 +0000 |
---|---|---|
committer | dos-reis <gdr@axiomatics.org> | 2008-03-07 15:19:01 +0000 |
commit | 8531f4c74274b8aa99168d220738227557a9c418 (patch) | |
tree | c50b77870e432317be8f99c248e1339f74b51661 /src/hyper/extent2.pamphlet | |
parent | 33949ff2e6e5b5abe8d22c5604f42a6c9371079a (diff) | |
download | open-axiom-8531f4c74274b8aa99168d220738227557a9c418.tar.gz |
* hyper/: De-pamphletize.
Diffstat (limited to 'src/hyper/extent2.pamphlet')
-rw-r--r-- | src/hyper/extent2.pamphlet | 957 |
1 files changed, 0 insertions, 957 deletions
diff --git a/src/hyper/extent2.pamphlet b/src/hyper/extent2.pamphlet deleted file mode 100644 index d553a73e..00000000 --- a/src/hyper/extent2.pamphlet +++ /dev/null @@ -1,957 +0,0 @@ -\documentclass{article} -\usepackage{axiom} -\begin{document} -\title{\$SPAD/src/extent2} -\author{The Axiom Team} -\maketitle -\begin{abstract} -\end{abstract} -\eject -\tableofcontents -\eject -\section{extent2.c} -<<extent2.c>>= -/****************************************************************************** - * - * extent2.h: HyperDoc extent computation routines - * - * Copyright The Numerical Algorithms Group Limited 1991, 1992, 1993. - * - ****************************************************************************/ -#define _EXTENT2_C -#include "axiom-c-macros.h" -#include "useproto.h" -#include "debug.h" - - -#include "extent.h" -#include "group.h" -#include "titlebar.h" - -#include "all_hyper_proto.H1" -#include "pixmap.H1" - - -static int cur_height = 0; -static int max_x_value = 0; - -/* - * start_newline updates the current header node, and also allocates if needed - * memory for the next Line Header. It also assigns the first TextNode on the - * line to the structure, because this is the last time I will be able to do - * this - */ - -void -start_newline(int distance, TextNode * node) -{ - if (gLineNode != NULL) { - if (gTopOfGroupStack->center) - center_nodes(gLineNode, node); - gLineNode = node; - } - text_y += distance; - past_line_height = distance; - present_line_height = line_height; - gInLine = 0; -} - -/* - * center_nodes goes through and centers all the text between the two - * given nodes. - */ - -static void -center_nodes(TextNode * begin_node, TextNode * end_node) -{ - int begin_x, end_x, wmid_x, offset, mid_x; - TextNode *node; - - end_x = text_x; - begin_x = x_value(begin_node); - mid_x = (int) (end_x + begin_x) / 2; - wmid_x = (int) (right_margin + indent) / 2; - - if (mid_x > wmid_x) - offset = 0; - else - offset = wmid_x - mid_x; - - for (node = begin_node; node != end_node; node = node->next) - if (node->x > 0) - node->x += offset; -} - -static int -punctuation_width(TextNode * node) -{ - int twidth, width = strlen(node->data.text); - - twidth = XTextWidth(gTopOfGroupStack->cur_font, node->data.text, width); - - /* check to see if there was some space in front */ - - if (gInLine && (node->space & FRONTSPACE)) - twidth += inter_word_space; - -# if 0 - if (node->space & BACKSPACE) { - switch (node->data.text[0]) { - case '.': - case '?': - case '!': - twidth += term_punct_space; - break; - } - } -#endif - - return twidth; -} - -static int -input_string_width(TextNode * node) -{ - InputItem *item; - int t_width; - - /** search the symbol table for the proper entry **/ - - item = node->link->reference.string; - - /** Once I have gotten this far, I should just be able to calculate - the width using the normal font **/ - - t_width = (item->size + 1) * gInputFont->max_bounds.width + 10; - return t_width; - -} - -static int -word_width(TextNode * node) -{ - int twidth, len = strlen(node->data.text); - - twidth = XTextWidth(gTopOfGroupStack->cur_font, node->data.text, len); - if (node->space & FRONTSPACE) - twidth += inter_word_space; - - return twidth; -} - -static int -verbatim_width(TextNode * node) -{ - int twidth, len = strlen(node->data.text); - - twidth = XTextWidth(gTopOfGroupStack->cur_font, node->data.text, len); - if (node->space) - twidth += inter_word_space; - - return twidth; -} - -static int -width_of_dash(TextNode * node) -{ - int num_dashes, twidth; - - num_dashes = strlen(node->data.text); - if (num_dashes > 1) - twidth = node->width = num_dashes * dash_width; - else - twidth = node->width = XTextWidth(gTopOfGroupStack->cur_font, - node->data.text, 1); - if (node->space) - twidth += inter_word_space; - return twidth; -} - -/* - * return the gWindow->width in pixels of the given text node, when - * displayed - */ - -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; -} - -/* - * total_width traces through the nodes, until it finds a blank space. It is - * used by compute_word_extent, and compute_punctuation extent to determine - * How far we go before we actually see white space. - */ - -int -total_width(TextNode * node, int Ender) -{ - int twidth = 0; - - for (; (node != NULL); node = node->next) { - if (Ender == Endtokens) { - if (node->type >= Endtokens) - return twidth; - } - else if (node->type == Ender) - return twidth; - - /* - * The first thing we check for is to see if there was space in front - * of the current node, if so we are done - */ - - if (node->space) - return twidth; - - /*** Else depending on the node type ***/ - - switch (node->type) { - case Noop: - case Endinputbox: - case Pound: - case Ifcond: - case Fi: - case Endif: - break; - case Rsquarebrace: - case Punctuation: - case Word: - case Dash: - twidth += XTextWidth(gTopOfGroupStack->cur_font, node->data.text, - strlen(node->data.text)); - break; - case Box: - 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 Inputstring: - case SimpleBox: - case Radiobox: - case Upbutton: - case Returnbutton: - case Spadcommand: - case Spadgraph: - case VSpace: - case HSpace: - case Space: - case Table: - case Group: - case Controlbitmap: - case Inputbitmap: - case Inputpixmap: - case Free: - case Beep: - case Bound: - case Lsquarebrace: - case BoldFace: - case Emphasize: - case It: - case Rm: - case Sl: - case Tt: - case Newline: - case Verbatim: - case Spadsrctxt: - return twidth; - default: - break; - } - } - return twidth; -} - -/* - * init_extents initialize some text size variables - */ - -void -init_extents(void) -{ - present_line_height = line_height; - gInLine = 0; - gInItem = 0; - gInAxiomCommand = 0; - item_indent = 0; - gInDesc = 0; - indent = left_margin; - text_x = indent; - gTopOfGroupStack->cur_font = gRmFont; - gTopOfGroupStack->cur_color = gRmColor; - right_margin = gWindow->width - right_margin_space; - clear_item_stack(); -} - -/* - * init_title_extents initialize some title text size variables - */ - -void -init_title_extents(HyperDocPage * page) -{ - present_line_height = line_height; - gInLine = 0; - gInAxiomCommand = 0; - item_indent = 0; - gInDesc = 0; - indent = left_margin + page->title->x; - text_x = indent; - gTopOfGroupStack->cur_font = gRmFont; - gTopOfGroupStack->cur_color = gRmColor; - right_margin = gWindow->width - right_margin_space - gWindow->border_width - - 2 * twwidth; - clear_item_stack(); -} - -/* - * init_text initialize some text size variables - */ - -void -init_text(void) -{ - normal_text_height = gRmFont->ascent + gRmFont->descent; - line_height = gRmFont->ascent + gRmFont->descent + inter_line_space; - word_off_height = line_height - normal_text_height; - space_width = gRmFont->max_bounds.width; -} - -/* - * text_height returns the height of a piece of formatted text in pixels - */ - -int -text_height(TextNode * node, int Ender) -{ - cur_height = 0; - return text_height1(node, Ender); -} - -/* - * text_height1 is the recursive part of text_height - */ - -static int -text_height1(TextNode * node, int Ender) -{ - for (; node != NULL; node = node->next) { - if (Ender == Endtokens) { - if (node->type > -Endtokens) - return cur_height; - } - else if (node->type == Ender) - return cur_height; - switch (node->type) { - case Center: - case Downlink: - case Link: - case Spadcommand: - case Spadgraph: - case Upbutton: - case Returnbutton: - case Windowlink: - case Memolink: - case Lispwindowlink: - case Lisplink: - case Unixlink: - case Spadcall: - case Spadcallquit: - case Qspadcall: - case Qspadcallquit: - case LispDownLink: - case LispMemoLink: - case Lispcommand: - case Lispcommandquit: - case Spadlink: - case Spaddownlink: - case Spadmemolink: - case Unixcommand: - case SimpleBox: - case Radiobox: - case Group: - case Box: - case Controlbitmap: - case Inputbitmap: - case Inputpixmap: - case Horizontalline: - case Punctuation: - case Lsquarebrace: - case Rsquarebrace: - case Word: - case Verbatim: - case Math: - case Spadsrctxt: - case Dash: - case Inputstring: - cur_height = max(node->y, cur_height); - break; - case Mbox: - case Macro: - case Pound: - case Emphasize: - case BoldFace: - case It: - case Rm: - case Sl: - case Tt: - case Endparameter: - case Description: - case Enddescription: - case Noop: - case Fi: - case Ifcond: - case Endif: - case Endinputbox: - case Tab: - case Newline: - case Space: - case VSpace: - case HSpace: - case Beginitems: - case Begintitems: - case Endtitems: - case Titem: - case Enditems: - case Endtable: - case Endtableitem: - case Item: - case Par: - case Beep: - case Free: - case Bound: - case Endgroup: - case Endcenter: - case Endbutton: - case Endmacro: - case Tableitem: - case Endlink: - case Endspadcommand: - case Indent: - case Indentrel: - case Endbox: - case Endmbox: - case Table: - case Endverbatim: - case Endmath: - case Spadsrc: - case Endspadsrc: - break; - case Beginscroll: - case Endscroll: - break; - case Endscrolling: - return cur_height; - default: - - /* - * fprintf(stderr, "Text_height1: Unknown Node Type %d\n", - * node->type); - */ - break; - } - } - return cur_height; -} - -/* - * max_x returns the height of a piece of formatted text in pixels - */ - -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; -} - -static int -x_value(TextNode * node) -{ - for (; node != NULL; node = node->next) { - switch (node->type) { - case Controlbitmap: - case Inputbitmap: - case Inputpixmap: - case Lsquarebrace: - case Rsquarebrace: - case Word: - case Verbatim: - case Spadsrctxt: - case Dash: - case Punctuation: - case VSpace: - case HSpace: - case Horizontalline: - case Box: - case Downlink: - case Link: - case Lispwindowlink: - case Lisplink: - case Unixlink: - case Spadcall: - case Spadcallquit: - case Qspadcall: - case Qspadcallquit: - case LispDownLink: - case LispMemoLink: - case Lispcommand: - case Lispcommandquit: - case Spadlink: - case Spaddownlink: - case Spadmemolink: - case Spadcommand: - case Spadgraph: - case Unixcommand: - case Space: - case SimpleBox: - case Radiobox: - return node->x; - default: -#ifdef DEBUG - fprintf(stderr, "X_value did not know x value of type %d\n", node->type); -#endif - return x_value(node->next); - } - } - return 0; -} - -/* - * trailing_space computes the length of the trailing spaces of a node - */ - -int -trailing_space(TextNode * node) -{ - int space = 0; - - for (; node->type < Endtokens; node = node->next); - if (node->type == Space) - space += inter_word_space * - (node->data.node != NULL ? atoi(node->data.node->data.text) : 1); - return space; -} - -/* - * insert_bitmap_file reads a bitmap file into memory - */ - -void -insert_bitmap_file(TextNode * node) -{ - char *filename = node->data.text; - int bm_width, bm_height; - XImage *im; - ImageStruct *image; - - if (*filename == ' ') - filename++; - if (node->image.pm == 0) { - if ( - ((image = (ImageStruct *) hash_find(&gImageHashTable, filename)) == NULL) - || (getenv("HTCACHE"))) { - - /* - * read the bitmap if not already in memory or if the environment - * variable HTCACHE is set (NAG addition). - */ - - im = HTReadBitmapFile(gXDisplay, gXScreenNumber, filename, - &bm_width, &bm_height); - - /** now add the image to the gImageHashTable **/ - image = (ImageStruct *) halloc(sizeof(ImageStruct), "ImageStruct"); - image->image.xi = im; - image->width = image->image.xi->width; - image->height = image->image.xi->height; - image->filename = (char *) halloc(sizeof(char) * strlen(filename) +1,"Image Filename"); - /* strcpy(image->filename, filename); */ - sprintf(image->filename, "%s", filename); - hash_insert(&gImageHashTable, (char *)image, image->filename); - } - node->width = image->width; - node->height = image->height; - node->image.xi = image->image.xi; - } -} - -/* - * insert_pixmap_file reads a pixmap file into memory - */ - -void -insert_pixmap_file(TextNode * node) -{ - char *filename = node->data.text; - int bm_width, bm_height, ret_val; - XImage *xi; - ImageStruct *image; - - if (*filename == ' ') - filename++; - if (node->image.xi == 0) { - if ((image = (ImageStruct *) hash_find(&gImageHashTable, filename)) == NULL) { - ret_val = read_pixmap_file(gXDisplay, gXScreenNumber, filename, &xi, - &bm_width, &bm_height); - switch (ret_val) { - case(-1): - gSwitch_to_mono = 1; - return; - case BitmapFileInvalid: - fprintf(stderr, "File %s contains invalid bitmap data\n", filename); - return; - case BitmapOpenFailed: - fprintf(stderr, "couldn't open bitmap file %s\n", filename); - return; - case BitmapNoMemory: - fprintf(stderr, "not enough memory to store bitmap\n"); - return; - } - image = (ImageStruct *) halloc(sizeof(ImageStruct), "ImageStruct"); - image->width = bm_width; - image->height = bm_height; - image->filename = (char *) halloc(sizeof(char) * strlen(filename) +1, - "insert_pixmap--filename"); - /* strcpy(image->filename, filename); */ - sprintf(image->filename, "%s", filename); - image->image.xi = xi; - hash_insert(&gImageHashTable, (char *)image, image->filename); - } - node->width = image->width; - node->height = plh(image->height + inter_line_space); - node->image.xi = image->image.xi; - } -} - -/* - * plh calculates the closet value of line_height > height - */ - -int -plh(int height) -{ - int rheight = height; - - if (gExtentRegion == Scrolling) { - for (rheight = line_height; rheight < height; rheight += line_height) - ; - } - return rheight; -} -@ -\section{License} -<<license>>= -/* -Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - - Neither the name of The Numerical ALgorithms Group Ltd. nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER -OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -@ -<<*>>= -<<license>> -<<extent2.c>> -@ -\eject -\begin{thebibliography}{99} -\bibitem{1} nothing -\end{thebibliography} -\end{document} - - - - |