very slow updating of client area

Andrew Makhorin <[email protected]>
Newsgroups gmane.comp.emulators.wine.user
Message-ID <1347761534.2003.13.camel@corvax>
Hello,

Please see below a function that processes WM_PAINT message. Being run
under Wine this function updates the client area (50x120 chars) about 
50-100 times slower than under Windows XP. Could anyone please explain
me what might be wrong and how to fix that? 

Thank you,

Andrew Makhorin



/***********************************************************************
*  update_panel_area - update client area of panel window
*
*  This routine updates the client area of the window associated with
*  the specified panel. (It is called when the panel window procedure
*  receives the message WM_PAINT.) */

void update_panel_area(PANELX *px)
{     PAINTSTRUCT ps;
      HFONT old_hfont;
      HPEN old_hpen, hpen;
      int row, col, row1, row2, col1, col2;
      xassert(px != NULL);
      /* if the update region is empty, do nothing */
      if (!GetUpdateRect(px->window, NULL, FALSE))
         goto done;
      /* start updating */
      BeginPaint(px->window, &ps);
      old_hfont = SelectObject(ps.hdc, px->hfont);
      hpen = CreatePen(PS_SOLID, 0, 0x000000);
      old_hpen = SelectObject(ps.hdc, hpen);
      /* given the update region, determine which rows and columns of
         the display area should be updated (note that the update
         region reported by BeginPaint does not include right-most and
         bottom-most pixels, so we subtract 1 in order not to update
         an extra row and column out of the update region) */
      row1 = 1 + ps.rcPaint.top / px->fy;
      row2 = 1 + (ps.rcPaint.bottom - 1) / px->fy;
      col1 = 1 + ps.rcPaint.left / px->fx;
      col2 = 1 + (ps.rcPaint.right - 1) / px->fx;
      /* updating is performed according to information in the buffer
         array of the panel display area (see rpsed.h) */
      for (row = row1; row <= row2; row++)
      {  for (col = col1; col <= col2; col++)
         {  FMTCHAR c;
            int x, y;
            char buf[1];
            /* get formatted character at position (row,col) */
            if (1 <= row && row <= px->p->nrows+1 &&
                1 <= col && col <= px->p->ncols+1)
               c = px->p->c[row][col];
            else
               c = px->p->std_char[FMT_SPACE];
            /* paint this character */
            x = (col - 1) * px->fx;
            y = (row - 1) * px->fy;
            SetTextColor(ps.hdc, palette->value[c.f]);
            SetBkColor(ps.hdc, palette->value[c.b]);
            SetBkMode(ps.hdc, OPAQUE);
            buf[0] = c.c;
            TextOut(ps.hdc, x, y, buf, 1);
            /* paint the underline, if specified */
            if (c.a & FMT_UNDERLINE)
            {  SetBkMode(ps.hdc, TRANSPARENT);
               TextOut(ps.hdc, x, y, "_", 1);
            }
            /* paint the vertical bar, if specified */
            if (c.a & FMT_MARGIN)
            {  MoveToEx(ps.hdc, x, y, NULL);
               LineTo(ps.hdc, x, y + px->fy);
            }
         }
      }
      /* finish updating */
      SelectObject(ps.hdc, old_hfont);
      SelectObject(ps.hdc, old_hpen);
      DeleteObject(hpen);
      EndPaint(px->window, &ps);
done: return;
}
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.