very slow updating of client area

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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;
}





[Index of Archives]     [Gimp for Windows]     [Red Hat]     [Samba]     [Yosemite Camping]     [Graphics Cards]     [Wine Home]

  Powered by Linux