kwrite widget- better performance
Vladimir Dvorak
lada.dvorak at merz.cz
Tue Nov 2 08:05:19 GMT 1999
Hi all,
I have used a modified text-drawing function in kwrite widget
for some time. It looks much better especially on remote X-server.
Let's try to change ./kdevelop/kwrite/kwdoc.cpp :
////////////////////////////////////////////////////////////////////////
void
KWriteDoc::paintTextLine(QPainter &paint, int line, int xStart, int xEnd)
{
int y;
TextLine *textLine;
int z, x;
char ch;
Attribute *a = 0L;
int attr, nextAttr;
int xs;
int xc, zc;
static char aLB[256];
int aCnt, xcp;
y = 0;//line*fontHeight - yPos;
if (line >= (int) contents.count()) {
paint.fillRect(0,y,xEnd - xStart,fontHeight,colors[4]);
return;
}
//printf("xStart = %d, xEnd = %d, line = %d\n",xStart,xEnd,line);
//printf("text = ");
textLine = contents.at(line);
z = 0;
x = 0;
do {
xc = x;
ch = textLine->getChar(z);
if (ch == '\t') {
x += tabWidth - (x % tabWidth);
} else {
a = &attribs[textLine->getAttr(z)];
x += a->fm.width(&ch,1);
}
z++;
} while (x <= xStart);
zc = z - 1;
xs = xStart;
attr = textLine->getRawAttr(zc);
while (x < xEnd) {
nextAttr = textLine->getRawAttr(z);
if ((nextAttr ^ attr) & (taSelectMask | 256)) {
paint.fillRect(xs - xStart,y,x - xs,fontHeight,colors[attr >> taShift]);
xs = x;
attr = nextAttr;
}
ch = textLine->getChar(z);
if (ch == '\t') {
x += tabWidth - (x % tabWidth);
} else {
a = &attribs[attr & taAttrMask];
x += a->fm.width(&ch,1);
}
z++;
}
paint.fillRect(xs - xStart,y,xEnd - xs,fontHeight,colors[attr >> taShift]);
y += fontAscent -1;
attr = -1;
aCnt = 0;
xcp = xc;
while (xc < xEnd) {
ch = textLine->getChar(zc);
if (ch == '\t') {
xc += tabWidth - (xc % tabWidth);
if(aCnt!=0) {
paint.drawText(xcp - xStart,y,aLB,aCnt);
aCnt = 0;
}
xcp = xc;
}
else {
nextAttr = textLine->getRawAttr(zc);
if (nextAttr != attr) {
if(aCnt!=0) {
paint.drawText(xcp - xStart,y,aLB,aCnt);
aCnt = 0;
xcp = xc;
}
attr = nextAttr;
a = &attribs[attr & taAttrMask];
if (attr & taSelectMask) paint.setPen(a->selCol); else paint.setPen(a->col);
paint.setFont(a->font);
}
aLB[aCnt++] = ch;
xc += a->fm.width(&ch,1);
if(aCnt == 256) {
paint.drawText(xcp - xStart,y,aLB,aCnt);
aCnt = 0;
xcp = xc;
}
}
zc++;
}
if(aCnt!=0) {
paint.drawText(xcp - xStart,y,aLB,aCnt);
aCnt = 0;
xcp = xc;
}
//printf("\n");
}
//////////////////////////////////////////////////////////////////////////
More information about the KDevelop
mailing list