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