/* sscript.c: layout/dimentioning and drawing routines for super and sub scripts. */ /* This file is part of asciiTeX. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; see the file COPYING. If not, write to The Free Software Foundation, Inc. 59 Temple Place, Suite 330 Boston, MA 02111 USA Authors: Original program (eqascii): Przemek Borys Fork by: Bart Pieters *************************************************************************/ #include #include #include "parsedef.h" #include "utils.h" #include "asciiTeX_struct.h" #include "dim.h" #include "draw.h" int dimSubscript(char *found, char **Gpos, Tdim * Our, struct Tgraph *graph) /* The dimXxx routines all have the forllowing arguments: found -- Pointer to a sting containing the remaining part of the equation Gpos -- Pointer to a string which will contain the part of the equation relevant to the current parent with flags to indicate which drawing routines to use. Our -- dimention of the parent graph -- The parent The routines returns the number of characters it used of the found vector. */ { #define gpos (*Gpos) #define our (*Our) char *start = found + 1, *end, *tmp; Tdim out; *gpos = 1; gpos++; *gpos = (char) SUB; gpos++; *gpos = 0; end = findClosingBrace(start + 1); *end = 0; tmp = strdup(start + 1); *end = '}'; out = dim(tmp, newChild(graph)); free(tmp); if (out.y > our.baseline) { our.baseline = out.y; our.y += out.y; } if (gpos - graph->txt >= 4) { /* check if we had a superscript before */ if ((*(gpos - 4) == 1) && (*(gpos - 3) == (char) SUPER)) { /* yep, we had it */ int width = graph->down[graph->children - 2]->dim.x; if (width < out.x) our.x += out.x - width; } else our.x += out.x; } else our.x += out.x; return end - found; #undef gpos #undef our } void drawSubscript(int *Kid, int *Curx, int *Cury, char ***screen, struct Tgraph *graph, char *txt) { #define kid (*Kid) #define curx (*Curx) #define cury (*Cury) int width = graph->down[kid]->dim.x; if (txt - 3 >= graph->txt) { if ((*(txt - 3) == 1) && (*(txt - 2) == (char) SUPER)) { drawInternal(screen, graph->down[kid], curx - (graph->down[kid - 1]->dim.x), cury + 1); if (width > graph->down[kid - 1]->dim.y) curx += width - graph->down[kid - 1]->dim.y; } else { drawInternal(screen, graph->down[kid], curx, cury + 1); curx += width; } } else { drawInternal(screen, graph->down[kid], curx, cury + 1); curx += width; } kid++; } int dimSuperscript(char *found, char **Gpos, Tdim * Our, struct Tgraph *graph) /* The dimXxx routines all have the forllowing arguments: found -- Pointer to a sting containing the remaining part of the equation Gpos -- Pointer to a string which will contain the part of the equation relevant to the current parent with flags to indicate which drawing routines to use. Our -- dimention of the parent graph -- The parent The routines returns the number of characters it used of the found vector. */ { #define gpos (*Gpos) #define our (*Our) char *start = found + 1, *end, *tmp; Tdim out; *gpos = 1; /* See parsedef.h for the keyword * definitions */ gpos++; *gpos = (char) SUPER; gpos++; *gpos = 0; end = findClosingBrace(start + 1); *end = 0; tmp = strdup(start + 1); *end = '}'; out = dim(tmp, newChild(graph)); free(tmp); if (out.y + 1 > our.y - our.baseline) our.y = our.baseline + out.y + 1; if (gpos - graph->txt >= 4) { /* check if we had a subscript before */ if ((*(gpos - 4) == 1) && (*(gpos - 3) == (char) SUB)) { /* yep, we had it--our superscript will * start at the same pos as the subscript */ int width = graph->down[graph->children - 2]->dim.x; if (width < out.x) our.x += out.x - width; } else our.x += out.x; } else our.x += out.x; return end - found; } void drawSuperscript(int *Kid, int *Curx, int *Cury, char ***screen, struct Tgraph *graph, char *txt) /* The drawXxx routines all have the forllowing arguments: Kid -- Ineger index of the current child Curx -- Current x position in the 2D character field Cury -- Current y position in the 2D character field screen -- pointer to the 2D character field graph -- The parent */ { #define kid (*Kid) #define curx (*Curx) #define cury (*Cury) int width = graph->down[kid]->dim.x; if (txt - 3 >= graph->txt) { if ((*(txt - 3) == 1) && (*(txt - 2) == (char) SUB)) { drawInternal(screen, graph->down[kid], curx - (graph->down[kid - 1]->dim.x), cury - (graph->down[kid]->dim.y)); if (width > graph->down[kid - 1]->dim.x) curx += width - graph->down[kid - 1]->dim.x; } else { drawInternal(screen, graph->down[kid], curx, cury - (graph->down[kid]->dim.y)); curx += width; } } else { drawInternal(screen, graph->down[kid], curx, cury - (graph->down[kid]->dim.y)); curx += width; } kid++; }