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 times slower than under Windows XP. Could anyone please explain me what might be wrong and suggest 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; }