do_text.c revision 533545b5
1264fa531Smrg/***************************************************************************** 2264fa531SmrgCopyright 1988, 1989 by Digital Equipment Corporation, Maynard, Massachusetts. 3264fa531Smrg 4264fa531Smrg All Rights Reserved 5264fa531Smrg 6264fa531SmrgPermission to use, copy, modify, and distribute this software and its 7264fa531Smrgdocumentation for any purpose and without fee is hereby granted, 8264fa531Smrgprovided that the above copyright notice appear in all copies and that 9264fa531Smrgboth that copyright notice and this permission notice appear in 10264fa531Smrgsupporting documentation, and that the name of Digital not be 11264fa531Smrgused in advertising or publicity pertaining to distribution of the 12264fa531Smrgsoftware without specific, written prior permission. 13264fa531Smrg 14264fa531SmrgDIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING 15264fa531SmrgALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL 16264fa531SmrgDIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR 17264fa531SmrgANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, 18264fa531SmrgWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, 19264fa531SmrgARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 20264fa531SmrgSOFTWARE. 21264fa531Smrg 22264fa531Smrg******************************************************************************/ 23264fa531Smrg 24264fa531Smrg#include "x11perf.h" 25264fa531Smrg#include <stdio.h> 26264fa531Smrg 27264fa531Smrgstatic char **charBuf; 28264fa531Smrgstatic XFontStruct *font, *bfont; 29264fa531Smrgstatic int height, ypos; 30264fa531Smrgstatic XTextItem *items; 31264fa531Smrgstatic int charsPerLine, totalLines; 32264fa531Smrg 33264fa531Smrg#define XPOS 20 34264fa531Smrg#define SEGS 3 35264fa531Smrg 36264fa531Smrg 37264fa531Smrgint 38533545b5SmrgInitText(XParms xp, Parms p, int64_t reps) 39264fa531Smrg{ 40264fa531Smrg int i, j; 41264fa531Smrg char ch; 42264fa531Smrg XGCValues gcv; 43264fa531Smrg 44264fa531Smrg font = XLoadQueryFont(xp->d, p->font); 45264fa531Smrg if (font == NULL) { 46264fa531Smrg printf("Could not load font '%s', benchmark omitted\n", p->font); 47264fa531Smrg return 0; 48264fa531Smrg } 49264fa531Smrg 50264fa531Smrg bfont = NULL; 51264fa531Smrg if (p->bfont != NULL) { 52264fa531Smrg bfont = XLoadQueryFont(xp->d, p->bfont); 53264fa531Smrg if (bfont == NULL) { 54264fa531Smrg printf("Could not load font '%s', benchmark omitted\n", p->bfont); 55264fa531Smrg return 0; 56264fa531Smrg } 57264fa531Smrg } 58264fa531Smrg 59264fa531Smrg ypos = XPOS; 60264fa531Smrg height = (font->max_bounds.ascent + font->max_bounds.descent) + 1; 61264fa531Smrg if (bfont != NULL) { 62264fa531Smrg int h = (bfont->max_bounds.ascent + bfont->max_bounds.descent) + 1; 63264fa531Smrg if (h > height) 64264fa531Smrg height = h; 65264fa531Smrg } 66264fa531Smrg gcv.font = font->fid; 67264fa531Smrg XChangeGC(xp->d, xp->fggc, GCFont, &gcv); 68264fa531Smrg XChangeGC(xp->d, xp->bggc, GCFont, &gcv); 69264fa531Smrg 70264fa531Smrg charsPerLine = p->objects; 71264fa531Smrg charsPerLine = (charsPerLine + 3) & ~3; 72264fa531Smrg p->objects = charsPerLine; 73264fa531Smrg 74264fa531Smrg totalLines = '\177' - ' ' + 1; 75264fa531Smrg if (totalLines > reps) totalLines = reps; 76264fa531Smrg 77264fa531Smrg charBuf = (char **) malloc(totalLines*sizeof (char *)); 78264fa531Smrg if (p->special) 79264fa531Smrg items = (XTextItem *) malloc(totalLines*SEGS*sizeof (XTextItem)); 80264fa531Smrg 81264fa531Smrg for (i = 0; i != totalLines; i++) { 82264fa531Smrg charBuf[i] = (char *) malloc (sizeof (char)*charsPerLine); 83264fa531Smrg ch = i + ' '; 84264fa531Smrg for (j = 0; j != charsPerLine; j++) { 85264fa531Smrg charBuf[i][j] = ch; 86264fa531Smrg if (ch == '\177') ch = ' '; else ch++; 87264fa531Smrg } 88264fa531Smrg if (p->special) { 89264fa531Smrg items[i*SEGS+0].chars = &(charBuf[i][0]); 90264fa531Smrg items[i*SEGS+0].nchars = charsPerLine/4; 91264fa531Smrg items[i*SEGS+0].delta = 0; 92264fa531Smrg items[i*SEGS+0].font = font->fid; 93264fa531Smrg items[i*SEGS+1].chars = &(charBuf[i][charsPerLine/4]); 94264fa531Smrg items[i*SEGS+1].nchars = charsPerLine/2; 95264fa531Smrg items[i*SEGS+1].delta = 3; 96264fa531Smrg items[i*SEGS+1].font = bfont->fid; 97264fa531Smrg items[i*SEGS+2].chars = &(charBuf[i][3*charsPerLine/4]); 98264fa531Smrg items[i*SEGS+2].nchars = charsPerLine/4; 99264fa531Smrg items[i*SEGS+2].delta = 3; 100264fa531Smrg items[i*SEGS+2].font = font->fid; 101264fa531Smrg } 102264fa531Smrg } 103264fa531Smrg return reps; 104264fa531Smrg} 105264fa531Smrg 106264fa531Smrg 107264fa531Smrg#define GetRealChar(font, totalChars, ch) \ 108264fa531Smrg{ \ 109264fa531Smrg XCharStruct *pci; \ 110264fa531Smrg do { \ 111264fa531Smrg ch--; \ 112264fa531Smrg if (ch < 0) { \ 113264fa531Smrg ch = totalChars-1; \ 114264fa531Smrg } \ 115264fa531Smrg if (font->per_char == NULL) break; \ 116264fa531Smrg pci = &(font->per_char[ch]); \ 117264fa531Smrg } while ( (pci->lbearing | pci->rbearing | pci->width \ 118264fa531Smrg | pci->ascent | pci->descent | pci->attributes) == 0); \ 119264fa531Smrg} /* GetRealChar */ 120264fa531Smrg 121264fa531Smrgint 122533545b5SmrgInitText16(XParms xp, Parms p, int64_t reps) 123264fa531Smrg{ 124264fa531Smrg register int i, j; 125264fa531Smrg register char *pbuf0, *pbuf1, *pbuf2; 126264fa531Smrg XGCValues gcv; 127264fa531Smrg int rows, columns, totalChars, ch; 128264fa531Smrg int brows, bcolumns = 0, btotalChars = 0, bch = 0; 129264fa531Smrg 130264fa531Smrg font = XLoadQueryFont(xp->d, p->font); 131264fa531Smrg if (font == NULL) { 132264fa531Smrg printf("Could not load font '%s', benchmark omitted\n", p->font); 133264fa531Smrg return 0; 134264fa531Smrg } 135264fa531Smrg rows = font->max_byte1 - font->min_byte1 + 1; 136264fa531Smrg columns = font->max_char_or_byte2 - font->min_char_or_byte2 + 1; 137264fa531Smrg totalChars = rows * columns; 138264fa531Smrg totalLines = rows; 139264fa531Smrg ch = totalChars; 140264fa531Smrg 141264fa531Smrg bfont = NULL; 142264fa531Smrg if (p->bfont != NULL) { 143264fa531Smrg bfont = XLoadQueryFont(xp->d, p->bfont); 144264fa531Smrg if (bfont == NULL) { 145264fa531Smrg printf("Could not load font '%s', benchmark omitted\n", p->bfont); 146264fa531Smrg return 0; 147264fa531Smrg } 148264fa531Smrg brows = bfont->max_byte1 - bfont->min_byte1 + 1; 149264fa531Smrg bcolumns = bfont->max_char_or_byte2 - bfont->min_char_or_byte2 + 1; 150264fa531Smrg btotalChars = brows * bcolumns; 151264fa531Smrg bch = btotalChars; 152264fa531Smrg if (brows > totalLines) totalLines = brows; 153264fa531Smrg } 154264fa531Smrg 155264fa531Smrg ypos = XPOS; 156264fa531Smrg height = (font->max_bounds.ascent + font->max_bounds.descent) + 1; 157264fa531Smrg if (bfont != NULL) { 158264fa531Smrg int h = (bfont->max_bounds.ascent + bfont->max_bounds.descent) + 1; 159264fa531Smrg if (h > height) 160264fa531Smrg height = h; 161264fa531Smrg } 162264fa531Smrg gcv.font = font->fid; 163264fa531Smrg XChangeGC(xp->d, xp->fggc, GCFont, &gcv); 164264fa531Smrg XChangeGC(xp->d, xp->bggc, GCFont, &gcv); 165264fa531Smrg 166264fa531Smrg charsPerLine = p->objects; 167264fa531Smrg 168264fa531Smrg if (totalLines > reps) totalLines = reps; 169264fa531Smrg 170264fa531Smrg if (p->special) { 171264fa531Smrg charsPerLine = (charsPerLine + 3) & ~3; /* make a multiple of four */ 172264fa531Smrg p->objects = charsPerLine; 173264fa531Smrg 174264fa531Smrg items = (XTextItem *) malloc(totalLines*SEGS*sizeof (XTextItem)); 175264fa531Smrg 176264fa531Smrg for (i = 0; i < totalLines; i++) { 177264fa531Smrg pbuf0 = items[i*SEGS+0].chars = 178264fa531Smrg (char *) malloc (sizeof (char)*charsPerLine/2); 179264fa531Smrg items[i*SEGS+0].nchars = charsPerLine/4; 180264fa531Smrg items[i*SEGS+0].delta = 0; 181264fa531Smrg items[i*SEGS+0].font = font->fid; 182264fa531Smrg pbuf1 = items[i*SEGS+1].chars = 183264fa531Smrg (char *) malloc (sizeof (char)*charsPerLine); 184264fa531Smrg items[i*SEGS+1].nchars = charsPerLine/2; 185264fa531Smrg items[i*SEGS+1].delta = 3; 186264fa531Smrg items[i*SEGS+1].font = bfont->fid; 187264fa531Smrg pbuf2 = items[i*SEGS+2].chars = 188264fa531Smrg (char *) malloc (sizeof (char)*charsPerLine/2); 189264fa531Smrg items[i*SEGS+2].nchars = charsPerLine/4; 190264fa531Smrg items[i*SEGS+2].delta = 3; 191264fa531Smrg items[i*SEGS+2].font = font->fid; 192264fa531Smrg for (j = 0; j < charsPerLine/4; j++) { 193264fa531Smrg GetRealChar(font, totalChars, ch); 194264fa531Smrg *pbuf0++ = ch / columns + font->min_byte1; 195264fa531Smrg *pbuf0++ = ch % columns + font->min_char_or_byte2; 196264fa531Smrg GetRealChar(font, totalChars, ch); 197264fa531Smrg *pbuf2++ = ch / columns + font->min_byte1; 198264fa531Smrg *pbuf2++ = ch % columns + font->min_char_or_byte2; 199264fa531Smrg } 200264fa531Smrg for (j = 0; j < charsPerLine/2; j++) { 201264fa531Smrg GetRealChar(bfont, btotalChars, bch); 202264fa531Smrg *pbuf1++ = bch / bcolumns + bfont->min_byte1; 203264fa531Smrg *pbuf1++ = bch % bcolumns + bfont->min_char_or_byte2; 204264fa531Smrg } 205264fa531Smrg } 206264fa531Smrg } else { 207264fa531Smrg charBuf = (char **) malloc(totalLines*sizeof (char *)); 208264fa531Smrg for (i = 0; i < totalLines; i++) { 209264fa531Smrg pbuf0 = charBuf[i] = (char *) malloc (sizeof (char)*charsPerLine*2); 210264fa531Smrg for (j = 0; j < charsPerLine; j++) { 211264fa531Smrg GetRealChar(font, totalChars, ch); 212264fa531Smrg *pbuf0++ = ch / columns + font->min_byte1; 213264fa531Smrg *pbuf0++ = ch % columns + font->min_char_or_byte2; 214264fa531Smrg } 215264fa531Smrg } 216264fa531Smrg } 217264fa531Smrg return reps; 218264fa531Smrg} 219264fa531Smrg 220264fa531Smrgvoid 221533545b5SmrgDoText(XParms xp, Parms p, int64_t reps) 222264fa531Smrg{ 223264fa531Smrg int i, line, startLine; 224264fa531Smrg 225264fa531Smrg startLine = 0; 226264fa531Smrg line = 0; 227264fa531Smrg for (i = 0; i != reps; i++) { 228264fa531Smrg XDrawString( 229264fa531Smrg xp->d, xp->w, xp->fggc, XPOS, ypos, charBuf[line], charsPerLine); 230264fa531Smrg ypos += height; 231264fa531Smrg if (ypos > HEIGHT - height) { 232264fa531Smrg /* Wraparound to top of window */ 233264fa531Smrg ypos = XPOS; 234264fa531Smrg line = startLine; 235264fa531Smrg startLine = (startLine + 1) % totalLines; 236264fa531Smrg } 237264fa531Smrg line = (line + 1) % totalLines; 238264fa531Smrg CheckAbort (); 239264fa531Smrg } 240264fa531Smrg} 241264fa531Smrg 242264fa531Smrgvoid 243533545b5SmrgDoText16(XParms xp, Parms p, int64_t reps) 244264fa531Smrg{ 245264fa531Smrg int i, line, startLine; 246264fa531Smrg 247264fa531Smrg startLine = 0; 248264fa531Smrg line = 0; 249264fa531Smrg for (i = 0; i < reps; i++) { 250264fa531Smrg XDrawString16( 251264fa531Smrg xp->d, xp->w, xp->fggc, XPOS, ypos, (XChar2b *)charBuf[line], charsPerLine); 252264fa531Smrg ypos += height; 253264fa531Smrg if (ypos > HEIGHT - height) { 254264fa531Smrg /* Wraparound to top of window */ 255264fa531Smrg ypos = XPOS; 256264fa531Smrg line = startLine; 257264fa531Smrg startLine = (startLine + 1) % totalLines; 258264fa531Smrg } 259264fa531Smrg line = (line + 1) % totalLines; 260264fa531Smrg CheckAbort (); 261264fa531Smrg } 262264fa531Smrg} 263264fa531Smrg 264264fa531Smrgvoid 265533545b5SmrgDoPolyText(XParms xp, Parms p, int64_t reps) 266264fa531Smrg{ 267264fa531Smrg int i, line, startLine; 268264fa531Smrg 269264fa531Smrg startLine = 0; 270264fa531Smrg line = 0; 271264fa531Smrg for (i = 0; i != reps; i++) { 272264fa531Smrg XDrawText( 273264fa531Smrg xp->d, xp->w, xp->fggc, XPOS, ypos, &items[line*SEGS], SEGS); 274264fa531Smrg ypos += height; 275264fa531Smrg if (ypos > HEIGHT - height) { 276264fa531Smrg /* Wraparound to top of window */ 277264fa531Smrg ypos = XPOS; 278264fa531Smrg line = startLine; 279264fa531Smrg startLine = (startLine + 1) % totalLines; 280264fa531Smrg } 281264fa531Smrg line = (line + 1) % totalLines; 282264fa531Smrg CheckAbort (); 283264fa531Smrg } 284264fa531Smrg} 285264fa531Smrg 286264fa531Smrgvoid 287533545b5SmrgDoPolyText16(XParms xp, Parms p, int64_t reps) 288264fa531Smrg{ 289264fa531Smrg int i, line, startLine; 290264fa531Smrg 291264fa531Smrg startLine = 0; 292264fa531Smrg line = 0; 293264fa531Smrg for (i = 0; i != reps; i++) { 294264fa531Smrg XDrawText16( 295264fa531Smrg xp->d, xp->w, xp->fggc, XPOS, ypos, (XTextItem16 *)&items[line*SEGS], SEGS); 296264fa531Smrg ypos += height; 297264fa531Smrg if (ypos > HEIGHT - height) { 298264fa531Smrg /* Wraparound to top of window */ 299264fa531Smrg ypos = XPOS; 300264fa531Smrg line = startLine; 301264fa531Smrg startLine = (startLine + 1) % totalLines; 302264fa531Smrg } 303264fa531Smrg line = (line + 1) % totalLines; 304264fa531Smrg CheckAbort (); 305264fa531Smrg } 306264fa531Smrg} 307264fa531Smrg 308264fa531Smrgvoid 309533545b5SmrgDoImageText(XParms xp, Parms p, int64_t reps) 310264fa531Smrg{ 311264fa531Smrg int i, line, startLine; 312264fa531Smrg 313264fa531Smrg startLine = 0; 314264fa531Smrg line = 0; 315264fa531Smrg for (i = 0; i != reps; i++) { 316264fa531Smrg XDrawImageString( 317264fa531Smrg xp->d, xp->w, xp->fggc, XPOS, ypos, charBuf[line], charsPerLine); 318264fa531Smrg ypos += height; 319264fa531Smrg if (ypos > HEIGHT - height) { 320264fa531Smrg /* Wraparound to top of window */ 321264fa531Smrg ypos = XPOS; 322264fa531Smrg startLine = (startLine + 17) % totalLines; 323264fa531Smrg line = startLine; 324264fa531Smrg } 325264fa531Smrg line = (line + 1) % totalLines; 326264fa531Smrg CheckAbort (); 327264fa531Smrg } 328264fa531Smrg} 329264fa531Smrg 330264fa531Smrgvoid 331533545b5SmrgDoImageText16(XParms xp, Parms p, int64_t reps) 332264fa531Smrg{ 333264fa531Smrg int i, line, startLine; 334264fa531Smrg 335264fa531Smrg startLine = 0; 336264fa531Smrg line = 0; 337264fa531Smrg for (i = 0; i != reps; i++) { 338264fa531Smrg XDrawImageString16( 339264fa531Smrg xp->d, xp->w, xp->fggc, XPOS, ypos, (XChar2b *)charBuf[line], charsPerLine); 340264fa531Smrg ypos += height; 341264fa531Smrg if (ypos > HEIGHT - height) { 342264fa531Smrg /* Wraparound to top of window */ 343264fa531Smrg ypos = XPOS; 344264fa531Smrg startLine = (startLine + 17) % totalLines; 345264fa531Smrg line = startLine; 346264fa531Smrg } 347264fa531Smrg line = (line + 1) % totalLines; 348264fa531Smrg CheckAbort (); 349264fa531Smrg } 350264fa531Smrg} 351264fa531Smrg 352264fa531Smrgvoid 353264fa531SmrgClearTextWin(XParms xp, Parms p) 354264fa531Smrg{ 355264fa531Smrg XClearWindow(xp->d, xp->w); 356264fa531Smrg} 357264fa531Smrg 358264fa531Smrgvoid 359264fa531SmrgEndText(XParms xp, Parms p) 360264fa531Smrg{ 361264fa531Smrg int i; 362264fa531Smrg 363264fa531Smrg if(font==NULL)return; 364264fa531Smrg for (i = 0; i != totalLines; i++) 365264fa531Smrg free(charBuf[i]); 366264fa531Smrg free(charBuf); 367264fa531Smrg if (p->special) 368264fa531Smrg free(items); 369264fa531Smrg XFreeFont(xp->d, font); 370264fa531Smrg if (bfont != NULL) 371264fa531Smrg XFreeFont(xp->d, bfont); 372264fa531Smrg} 373264fa531Smrg 374264fa531Smrgvoid 375264fa531SmrgEndText16(XParms xp, Parms p) 376264fa531Smrg{ 377264fa531Smrg int i; 378264fa531Smrg 379264fa531Smrg if(font==NULL)return; 380264fa531Smrg if (p->special) { 381264fa531Smrg for (i = 0; i < totalLines; i++) { 382264fa531Smrg free(items[i*SEGS+0].chars); 383264fa531Smrg free(items[i*SEGS+1].chars); 384264fa531Smrg free(items[i*SEGS+2].chars); 385264fa531Smrg } 386264fa531Smrg free(items); 387264fa531Smrg } else { 388264fa531Smrg for (i = 0; i < totalLines; i++) { 389264fa531Smrg free(charBuf[i]); 390264fa531Smrg } 391264fa531Smrg free(charBuf); 392264fa531Smrg } 393264fa531Smrg XFreeFont(xp->d, font); 394264fa531Smrg if(bfont != NULL) { 395264fa531Smrg XFreeFont(xp->d, bfont); 396264fa531Smrg } 397264fa531Smrg} 398264fa531Smrg 399264fa531Smrg#ifdef XFT 400264fa531Smrg#include <X11/extensions/Xrender.h> 401264fa531Smrg#include <X11/Xft/Xft.h> 402264fa531Smrg 403264fa531Smrgstatic XftFont *aafont; 404264fa531Smrgstatic XftDraw *aadraw; 405264fa531Smrgstatic XftColor aacolor; 406264fa531Smrg 407264fa531Smrgint 408533545b5SmrgInitAAText(XParms xp, Parms p, int64_t reps) 409264fa531Smrg{ 410264fa531Smrg int i, j; 411264fa531Smrg char ch; 412264fa531Smrg XRenderColor color; 413264fa531Smrg 414264fa531Smrg aafont = XftFontOpenName (xp->d, DefaultScreen (xp->d), p->font); 415264fa531Smrg 416264fa531Smrg if (aafont == NULL) 417264fa531Smrg { 418264fa531Smrg printf("Could not load font '%s', benchmark omitted\n", 419264fa531Smrg p->font); 420264fa531Smrg return 0; 421264fa531Smrg } 422264fa531Smrg 423264fa531Smrg aadraw = XftDrawCreate (xp->d, xp->w, 424264fa531Smrg xp->vinfo.visual, 425264fa531Smrg xp->cmap); 426264fa531Smrg 427264fa531Smrg if (!aadraw) 428264fa531Smrg { 429264fa531Smrg printf ("Cannot create XftDraw object\n"); 430264fa531Smrg XftFontClose (xp->d, aafont); 431264fa531Smrg return 0; 432264fa531Smrg } 433264fa531Smrg color.red = 0; 434264fa531Smrg color.green = 0; 435264fa531Smrg color.blue = 0; 436264fa531Smrg color.alpha = 0xffff; 437264fa531Smrg if (!XftColorAllocValue (xp->d, 438264fa531Smrg xp->vinfo.visual, 439264fa531Smrg xp->cmap, 440264fa531Smrg &color, &aacolor)) 441264fa531Smrg { 442264fa531Smrg printf ("Cannot allocate black\n"); 443264fa531Smrg XftFontClose (xp->d, aafont); 444264fa531Smrg XftDrawDestroy (aadraw); 445c37a63b8Smrg aafont = NULL; 446c37a63b8Smrg aadraw = NULL; 447264fa531Smrg return 0; 448264fa531Smrg } 449264fa531Smrg 450264fa531Smrg ypos = XPOS; 451264fa531Smrg height = aafont->height; 452264fa531Smrg 453264fa531Smrg charsPerLine = p->objects; 454264fa531Smrg charsPerLine = (charsPerLine + 3) & ~3; 455264fa531Smrg p->objects = charsPerLine; 456264fa531Smrg 457264fa531Smrg totalLines = '\177' - ' ' + 1; 458264fa531Smrg if (totalLines > reps) totalLines = reps; 459264fa531Smrg 460264fa531Smrg charBuf = (char **) malloc(totalLines*sizeof (char *)); 461264fa531Smrg 462264fa531Smrg for (i = 0; i != totalLines; i++) { 463264fa531Smrg charBuf[i] = (char *) malloc (sizeof (char)*charsPerLine); 464264fa531Smrg ch = i + ' '; 465264fa531Smrg for (j = 0; j != charsPerLine; j++) { 466264fa531Smrg charBuf[i][j] = ch; 467264fa531Smrg if (ch == '\177') ch = ' '; else ch++; 468264fa531Smrg } 469264fa531Smrg } 470264fa531Smrg return reps; 471264fa531Smrg} 472264fa531Smrg 473264fa531Smrgvoid 474533545b5SmrgDoAAText(XParms xp, Parms p, int64_t reps) 475264fa531Smrg{ 476264fa531Smrg int i, line, startLine; 477264fa531Smrg 478264fa531Smrg startLine = 0; 479264fa531Smrg line = 0; 480264fa531Smrg for (i = 0; i != reps; i++) { 481264fa531Smrg XftDrawString8 (aadraw, &aacolor, aafont, 482264fa531Smrg XPOS, ypos, (unsigned char *) charBuf[line], charsPerLine); 483264fa531Smrg ypos += height; 484264fa531Smrg if (ypos > HEIGHT - height) { 485264fa531Smrg /* Wraparound to top of window */ 486264fa531Smrg ypos = XPOS; 487264fa531Smrg line = startLine; 488264fa531Smrg startLine = (startLine + 1) % totalLines; 489264fa531Smrg } 490264fa531Smrg line = (line + 1) % totalLines; 491264fa531Smrg CheckAbort (); 492264fa531Smrg } 493264fa531Smrg} 494264fa531Smrg 495264fa531Smrgvoid 496264fa531SmrgEndAAText(XParms xp, Parms p) 497264fa531Smrg{ 498264fa531Smrg int i; 499264fa531Smrg 500264fa531Smrg if(!aadraw)return; 501264fa531Smrg for (i = 0; i != totalLines; i++) 502264fa531Smrg free(charBuf[i]); 503264fa531Smrg free(charBuf); 504264fa531Smrg XftDrawDestroy (aadraw); 505264fa531Smrg XftFontClose (xp->d, aafont); 506264fa531Smrg XftColorFree (xp->d, 507264fa531Smrg xp->vinfo.visual, 508264fa531Smrg xp->cmap, 509264fa531Smrg &aacolor); 510264fa531Smrg} 511264fa531Smrg 512264fa531Smrg#endif 513