diff options
Diffstat (limited to 'do_text.c')
-rw-r--r-- | do_text.c | 411 |
1 files changed, 411 insertions, 0 deletions
diff --git a/do_text.c b/do_text.c new file mode 100644 index 0000000..c8f337f --- /dev/null +++ b/do_text.c @@ -0,0 +1,411 @@ +/* $Xorg: do_text.c,v 1.4 2000/08/17 19:54:10 cpqbld Exp $ */ +/***************************************************************************** +Copyright 1988, 1989 by Digital Equipment Corporation, Maynard, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Digital not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************************/ + +#include "x11perf.h" + +static char **charBuf; +static XFontStruct *font, *bfont; +static int height, ypos; +static XTextItem *items; +static int charsPerLine, totalLines; + +#define XPOS 20 +#define SEGS 3 + + +int InitText(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int i, j; + char ch; + XGCValues gcv; + + font = XLoadQueryFont(xp->d, p->font); + if (font == NULL) { + printf("Could not load font '%s', benchmark omitted\n", p->font); + return 0; + } + + bfont = NULL; + if (p->bfont != NULL) { + bfont = XLoadQueryFont(xp->d, p->bfont); + if (bfont == NULL) { + printf("Could not load font '%s', benchmark omitted\n", p->bfont); + return 0; + } + } + + ypos = XPOS; + height = (font->max_bounds.ascent + font->max_bounds.descent) + 1; + if (bfont != NULL) { + int h = (bfont->max_bounds.ascent + bfont->max_bounds.descent) + 1; + if (h > height) + height = h; + } + gcv.font = font->fid; + XChangeGC(xp->d, xp->fggc, GCFont, &gcv); + XChangeGC(xp->d, xp->bggc, GCFont, &gcv); + + charsPerLine = p->objects; + charsPerLine = (charsPerLine + 3) & ~3; + p->objects = charsPerLine; + + totalLines = '\177' - ' ' + 1; + if (totalLines > reps) totalLines = reps; + + charBuf = (char **) malloc(totalLines*sizeof (char *)); + if (p->special) + items = (XTextItem *) malloc(totalLines*SEGS*sizeof (XTextItem)); + + for (i = 0; i != totalLines; i++) { + charBuf[i] = (char *) malloc (sizeof (char)*charsPerLine); + ch = i + ' '; + for (j = 0; j != charsPerLine; j++) { + charBuf[i][j] = ch; + if (ch == '\177') ch = ' '; else ch++; + } + if (p->special) { + items[i*SEGS+0].chars = &(charBuf[i][0]); + items[i*SEGS+0].nchars = charsPerLine/4; + items[i*SEGS+0].delta = 0; + items[i*SEGS+0].font = font->fid; + items[i*SEGS+1].chars = &(charBuf[i][charsPerLine/4]); + items[i*SEGS+1].nchars = charsPerLine/2; + items[i*SEGS+1].delta = 3; + items[i*SEGS+1].font = bfont->fid; + items[i*SEGS+2].chars = &(charBuf[i][3*charsPerLine/4]); + items[i*SEGS+2].nchars = charsPerLine/4; + items[i*SEGS+2].delta = 3; + items[i*SEGS+2].font = font->fid; + } + } + return reps; +} + + +#define GetRealChar(font, totalChars, ch) \ +{ \ + XCharStruct *pci; \ + do { \ + ch--; \ + if (ch < 0) { \ + ch = totalChars-1; \ + } \ + if (font->per_char == NULL) break; \ + pci = &(font->per_char[ch]); \ + } while ( (pci->lbearing | pci->rbearing | pci->width \ + | pci->ascent | pci->descent | pci->attributes) == 0); \ +} /* GetRealChar */ + +int InitText16(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + register int i, j; + register char *pbuf0, *pbuf1, *pbuf2; + XGCValues gcv; + int rows, columns, totalChars, ch; + int brows, bcolumns, btotalChars, bch; + + font = XLoadQueryFont(xp->d, p->font); + if (font == NULL) { + printf("Could not load font '%s', benchmark omitted\n", p->font); + return 0; + } + rows = font->max_byte1 - font->min_byte1 + 1; + columns = font->max_char_or_byte2 - font->min_char_or_byte2 + 1; + totalChars = rows * columns; + totalLines = rows; + ch = totalChars; + + bfont = NULL; + if (p->bfont != NULL) { + bfont = XLoadQueryFont(xp->d, p->bfont); + if (bfont == NULL) { + printf("Could not load font '%s', benchmark omitted\n", p->bfont); + return 0; + } + brows = bfont->max_byte1 - bfont->min_byte1 + 1; + bcolumns = bfont->max_char_or_byte2 - bfont->min_char_or_byte2 + 1; + btotalChars = brows * bcolumns; + bch = btotalChars; + if (brows > totalLines) totalLines = brows; + } + + ypos = XPOS; + height = (font->max_bounds.ascent + font->max_bounds.descent) + 1; + if (bfont != NULL) { + int h = (bfont->max_bounds.ascent + bfont->max_bounds.descent) + 1; + if (h > height) + height = h; + } + gcv.font = font->fid; + XChangeGC(xp->d, xp->fggc, GCFont, &gcv); + XChangeGC(xp->d, xp->bggc, GCFont, &gcv); + + charsPerLine = p->objects; + + if (totalLines > reps) totalLines = reps; + + if (p->special) { + charsPerLine = (charsPerLine + 3) & ~3; /* make a multiple of four */ + p->objects = charsPerLine; + + items = (XTextItem *) malloc(totalLines*SEGS*sizeof (XTextItem)); + + for (i = 0; i < totalLines; i++) { + pbuf0 = items[i*SEGS+0].chars = + (char *) malloc (sizeof (char)*charsPerLine/2); + items[i*SEGS+0].nchars = charsPerLine/4; + items[i*SEGS+0].delta = 0; + items[i*SEGS+0].font = font->fid; + pbuf1 = items[i*SEGS+1].chars = + (char *) malloc (sizeof (char)*charsPerLine); + items[i*SEGS+1].nchars = charsPerLine/2; + items[i*SEGS+1].delta = 3; + items[i*SEGS+1].font = bfont->fid; + pbuf2 = items[i*SEGS+2].chars = + (char *) malloc (sizeof (char)*charsPerLine/2); + items[i*SEGS+2].nchars = charsPerLine/4; + items[i*SEGS+2].delta = 3; + items[i*SEGS+2].font = font->fid; + for (j = 0; j < charsPerLine/4; j++) { + GetRealChar(font, totalChars, ch); + *pbuf0++ = ch / columns + font->min_byte1; + *pbuf0++ = ch % columns + font->min_char_or_byte2; + GetRealChar(font, totalChars, ch); + *pbuf2++ = ch / columns + font->min_byte1; + *pbuf2++ = ch % columns + font->min_char_or_byte2; + } + for (j = 0; j < charsPerLine/2; j++) { + GetRealChar(bfont, btotalChars, bch); + *pbuf1++ = bch / bcolumns + bfont->min_byte1; + *pbuf1++ = bch % bcolumns + bfont->min_char_or_byte2; + } + } + } else { + charBuf = (char **) malloc(totalLines*sizeof (char *)); + for (i = 0; i < totalLines; i++) { + pbuf0 = charBuf[i] = (char *) malloc (sizeof (char)*charsPerLine*2); + for (j = 0; j < charsPerLine; j++) { + GetRealChar(font, totalChars, ch); + *pbuf0++ = ch / columns + font->min_byte1; + *pbuf0++ = ch % columns + font->min_char_or_byte2; + } + } + } + return reps; +} + +void DoText(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int i, line, startLine; + + startLine = 0; + line = 0; + for (i = 0; i != reps; i++) { + XDrawString( + xp->d, xp->w, xp->fggc, XPOS, ypos, charBuf[line], charsPerLine); + ypos += height; + if (ypos > HEIGHT - height) { + /* Wraparound to top of window */ + ypos = XPOS; + line = startLine; + startLine = (startLine + 1) % totalLines; + } + line = (line + 1) % totalLines; + } +} + +void DoText16(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int i, line, startLine; + + startLine = 0; + line = 0; + for (i = 0; i < reps; i++) { + XDrawString16( + xp->d, xp->w, xp->fggc, XPOS, ypos, (XChar2b *)charBuf[line], charsPerLine); + ypos += height; + if (ypos > HEIGHT - height) { + /* Wraparound to top of window */ + ypos = XPOS; + line = startLine; + startLine = (startLine + 1) % totalLines; + } + line = (line + 1) % totalLines; + } +} + +void DoPolyText(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int i, line, startLine; + + startLine = 0; + line = 0; + for (i = 0; i != reps; i++) { + XDrawText( + xp->d, xp->w, xp->fggc, XPOS, ypos, &items[line*SEGS], SEGS); + ypos += height; + if (ypos > HEIGHT - height) { + /* Wraparound to top of window */ + ypos = XPOS; + line = startLine; + startLine = (startLine + 1) % totalLines; + } + line = (line + 1) % totalLines; + } +} + +void DoPolyText16(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int i, line, startLine; + + startLine = 0; + line = 0; + for (i = 0; i != reps; i++) { + XDrawText16( + xp->d, xp->w, xp->fggc, XPOS, ypos, (XTextItem16 *)&items[line*SEGS], SEGS); + ypos += height; + if (ypos > HEIGHT - height) { + /* Wraparound to top of window */ + ypos = XPOS; + line = startLine; + startLine = (startLine + 1) % totalLines; + } + line = (line + 1) % totalLines; + } +} + +void DoImageText(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int i, line, startLine; + + startLine = 0; + line = 0; + for (i = 0; i != reps; i++) { + XDrawImageString( + xp->d, xp->w, xp->fggc, XPOS, ypos, charBuf[line], charsPerLine); + ypos += height; + if (ypos > HEIGHT - height) { + /* Wraparound to top of window */ + ypos = XPOS; + startLine = (startLine + 17) % totalLines; + line = startLine; + } + line = (line + 1) % totalLines; + } +} + +void DoImageText16(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int i, line, startLine; + + startLine = 0; + line = 0; + for (i = 0; i != reps; i++) { + XDrawImageString16( + xp->d, xp->w, xp->fggc, XPOS, ypos, (XChar2b *)charBuf[line], charsPerLine); + ypos += height; + if (ypos > HEIGHT - height) { + /* Wraparound to top of window */ + ypos = XPOS; + startLine = (startLine + 17) % totalLines; + line = startLine; + } + line = (line + 1) % totalLines; + } +} + +void ClearTextWin(xp, p) + XParms xp; + Parms p; +{ + XClearWindow(xp->d, xp->w); +} + +void EndText(xp, p) + XParms xp; + Parms p; +{ + int i; + + if(font==NULL)return; + for (i = 0; i != totalLines; i++) + free(charBuf[i]); + free(charBuf); + if (p->special) + free(items); + XFreeFont(xp->d, font); + if (bfont != NULL) + XFreeFont(xp->d, bfont); +} + +void EndText16(xp, p) + XParms xp; + Parms p; +{ + int i; + + if(font==NULL)return; + if (p->special) { + for (i = 0; i < totalLines; i++) { + free(items[i*SEGS+0].chars); + free(items[i*SEGS+1].chars); + free(items[i*SEGS+2].chars); + } + free(items); + } else { + for (i = 0; i < totalLines; i++) { + free(charBuf[i]); + } + free(charBuf); + } + XFreeFont(xp->d, font); + if(bfont != NULL) { + XFreeFont(xp->d, bfont); + } +} + |