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