[PATCH] [RichEdit]: properly handle the background in case of border in paragraph
Eric Pouech
eric.pouech at orange.fr
Thu Apr 24 15:04:26 CDT 2008
- also fixed potential indentation issue
A+
---
dlls/riched20/paint.c | 114 +++++++++++++++++++++++++++++--------------------
1 files changed, 67 insertions(+), 47 deletions(-)
diff --git a/dlls/riched20/paint.c b/dlls/riched20/paint.c
index ddd7de7..2ec7fb9 100644
--- a/dlls/riched20/paint.c
+++ b/dlls/riched20/paint.c
@@ -373,47 +373,51 @@ int ME_GetParaLineSpace(ME_Context* c, ME_Paragraph* para)
return sp * c->editor->nZoomNumerator / c->editor->nZoomDenominator;
}
-static int ME_DrawParaDecoration(ME_Context* c, ME_Paragraph* para, int y)
+static void ME_DrawParaDecoration(ME_Context* c, ME_Paragraph* para, int y, RECT* bounds)
{
- int idx, border_width;
- int ybefore, yafter;
+ int idx, border_width, top_border, bottom_border;
RECT rc;
- if (!(para->pFmt->dwMask & (PFM_BORDER | PFM_SPACEBEFORE | PFM_SPACEAFTER))) return 0;
+ SetRectEmpty(bounds);
+ if (!(para->pFmt->dwMask & (PFM_BORDER | PFM_SPACEBEFORE | PFM_SPACEAFTER))) return;
+
+ border_width = top_border = bottom_border = 0;
+ idx = (para->pFmt->wBorders >> 8) & 0xF;
+ if ((para->pFmt->dwMask & PFM_BORDER) && idx != 0 && (para->pFmt->wBorders & 0xF))
+ {
+ if (para->pFmt->wBorders & 0x00B0)
+ FIXME("Unsupported border flags %x\n", para->pFmt->wBorders);
+ border_width = ME_GetParaBorderWidth(c->editor, para->pFmt->wBorders);
+ if (para->pFmt->wBorders & 4) top_border = border_width;
+ if (para->pFmt->wBorders & 8) bottom_border = border_width;
+ }
if (para->pFmt->dwMask & PFM_SPACEBEFORE)
{
rc.left = c->rcView.left;
rc.right = c->rcView.right;
rc.top = y;
- ybefore = ME_twips2pointsY(c, para->pFmt->dySpaceBefore);
- rc.bottom = y + ybefore;
+ bounds->top = ME_twips2pointsY(c, para->pFmt->dySpaceBefore);
+ rc.bottom = y + bounds->top + top_border;
FillRect(c->hDC, &rc, c->editor->hbrBackground);
}
- else ybefore = 0;
+
if (para->pFmt->dwMask & PFM_SPACEAFTER)
{
rc.left = c->rcView.left;
rc.right = c->rcView.right;
rc.bottom = y + para->nHeight;
- yafter = ME_twips2pointsY(c, para->pFmt->dySpaceAfter);
- rc.top = rc.bottom - yafter;
+ bounds->bottom = ME_twips2pointsY(c, para->pFmt->dySpaceAfter);
+ rc.top = rc.bottom - bounds->bottom - bottom_border;
FillRect(c->hDC, &rc, c->editor->hbrBackground);
}
- else yafter = 0;
- border_width = 0;
- idx = (para->pFmt->wBorders >> 8) & 0xF;
if ((para->pFmt->dwMask & PFM_BORDER) && idx != 0 && (para->pFmt->wBorders & 0xF)) {
int pen_width;
COLORREF pencr;
HPEN pen = NULL, oldpen = NULL;
POINT pt;
- if (para->pFmt->wBorders & 0x00B0)
- FIXME("Unsupported border flags %x\n", para->pFmt->wBorders);
- border_width = ME_GetParaBorderWidth(c->editor, para->pFmt->wBorders);
-
if (para->pFmt->wBorders & 64) /* autocolor */
pencr = GetSysColor(COLOR_WINDOWTEXT);
else
@@ -425,50 +429,66 @@ static int ME_DrawParaDecoration(ME_Context* c, ME_Paragraph* para, int y)
MoveToEx(c->hDC, 0, 0, &pt);
/* before & after spaces are not included in border */
+
+ /* helper to draw the double lines in case of corner */
+#define DD(x) ((para->pFmt->wBorders & (x)) ? (pen_width + 1) : 0)
+
if (para->pFmt->wBorders & 1)
{
- MoveToEx(c->hDC, c->rcView.left, y + ybefore, NULL);
- LineTo(c->hDC, c->rcView.left, y + para->nHeight - yafter);
+ MoveToEx(c->hDC, c->rcView.left, y + bounds->top, NULL);
+ LineTo(c->hDC, c->rcView.left, y + para->nHeight - bounds->bottom);
if (border_details[idx].dble) {
- MoveToEx(c->hDC, c->rcView.left + pen_width + 1, y + ybefore + pen_width + 1, NULL);
- LineTo(c->hDC, c->rcView.left + pen_width + 1, y + para->nHeight - yafter - pen_width - 1);
+ rc.left = c->rcView.left + 1;
+ rc.right = rc.left + border_width;
+ rc.top = y + bounds->top;
+ rc.bottom = y + para->nHeight - bounds->bottom;
+ FillRect(c->hDC, &rc, c->editor->hbrBackground);
+ MoveToEx(c->hDC, c->rcView.left + pen_width + 1, y + bounds->top + DD(4), NULL);
+ LineTo(c->hDC, c->rcView.left + pen_width + 1, y + para->nHeight - bounds->bottom - DD(8));
}
+ bounds->left += border_width;
}
if (para->pFmt->wBorders & 2)
{
- MoveToEx(c->hDC, c->rcView.right, y + ybefore, NULL);
- LineTo(c->hDC, c->rcView.right, y + para->nHeight - yafter);
+ MoveToEx(c->hDC, c->rcView.right - 1, y + bounds->top, NULL);
+ LineTo(c->hDC, c->rcView.right - 1, y + para->nHeight - bounds->bottom);
if (border_details[idx].dble) {
- MoveToEx(c->hDC, c->rcView.right - pen_width - 1, y + ybefore + pen_width + 1, NULL);
- LineTo(c->hDC, c->rcView.right - pen_width - 1, y + para->nHeight - yafter - pen_width - 1);
+ rc.left = c->rcView.right - pen_width - 1;
+ rc.right = c->rcView.right - 1;
+ rc.top = y + bounds->top;
+ rc.bottom = y + para->nHeight - bounds->bottom;
+ FillRect(c->hDC, &rc, c->editor->hbrBackground);
+ MoveToEx(c->hDC, c->rcView.right - 1 - pen_width - 1, y + bounds->top + DD(4), NULL);
+ LineTo(c->hDC, c->rcView.right - 1 - pen_width - 1, y + para->nHeight - bounds->bottom - DD(8));
}
+ bounds->right += border_width;
}
if (para->pFmt->wBorders & 4)
{
- MoveToEx(c->hDC, c->rcView.left, y + ybefore, NULL);
- LineTo(c->hDC, c->rcView.right, y + ybefore);
+ MoveToEx(c->hDC, c->rcView.left, y + bounds->top, NULL);
+ LineTo(c->hDC, c->rcView.right, y + bounds->top);
if (border_details[idx].dble) {
- MoveToEx(c->hDC, c->rcView.left + pen_width + 1, y + ybefore + pen_width + 1, NULL);
- LineTo(c->hDC, c->rcView.right - pen_width - 1, y + ybefore + pen_width + 1);
+ MoveToEx(c->hDC, c->rcView.left + DD(1), y + bounds->top + pen_width + 1, NULL);
+ LineTo(c->hDC, c->rcView.right - DD(2), y + bounds->top + pen_width + 1);
}
+ bounds->top += border_width;
}
if (para->pFmt->wBorders & 8)
{
- MoveToEx(c->hDC, c->rcView.left, y + para->nHeight - yafter - 1, NULL);
- LineTo(c->hDC, c->rcView.right, y + para->nHeight - yafter - 1);
+ MoveToEx(c->hDC, c->rcView.left, y + para->nHeight - bounds->bottom - 1, NULL);
+ LineTo(c->hDC, c->rcView.right, y + para->nHeight - bounds->bottom - 1);
if (border_details[idx].dble) {
- MoveToEx(c->hDC, c->rcView.left + pen_width + 1, y + para->nHeight - yafter - 1 - pen_width - 1, NULL);
- LineTo(c->hDC, c->rcView.right - pen_width - 1, y + para->nHeight - yafter - 1 - pen_width - 1);
+ MoveToEx(c->hDC, c->rcView.left + DD(1), y + para->nHeight - bounds->bottom - 1 - pen_width - 1, NULL);
+ LineTo(c->hDC, c->rcView.right - DD(2), y + para->nHeight - bounds->bottom - 1 - pen_width - 1);
}
+ bounds->bottom += border_width;
}
+#undef DD
MoveToEx(c->hDC, pt.x, pt.y, NULL);
SelectObject(c->hDC, oldpen);
DeleteObject(pen);
}
- return ybefore +
- ((para->pFmt->dwMask & PFM_BORDER) && (para->pFmt->wBorders & 4) ?
- border_width : 0);
}
void ME_DrawParagraph(ME_Context *c, ME_DisplayItem *paragraph) {
@@ -476,12 +496,11 @@ void ME_DrawParagraph(ME_Context *c, ME_DisplayItem *paragraph) {
ME_DisplayItem *p;
ME_Run *run;
ME_Paragraph *para = NULL;
- RECT rc, rcPara;
+ RECT rc, rcPara, bounds;
int y = c->pt.y;
int height = 0, baseline = 0, no=0, pno = 0;
- int xe = 0;
+ int xs = 0, xe = 0;
BOOL visible = FALSE;
- int nMargWidth = 0;
c->pt.x = c->rcView.left;
rcPara.left = c->rcView.left;
@@ -491,11 +510,11 @@ void ME_DrawParagraph(ME_Context *c, ME_DisplayItem *paragraph) {
case diParagraph:
para = &p->member.para;
assert(para);
- nMargWidth = ME_twips2pointsX(c, para->pFmt->dxStartIndent);
- if (pno != 0)
- nMargWidth += ME_twips2pointsX(c, para->pFmt->dxOffset);
+ pno = 0;
+ xs = c->rcView.left + ME_twips2pointsX(c, para->pFmt->dxStartIndent);
xe = c->rcView.right - ME_twips2pointsX(c, para->pFmt->dxRightIndent);
- y += ME_DrawParaDecoration(c, para, y);
+ ME_DrawParaDecoration(c, para, y, &bounds);
+ y += bounds.top;
break;
case diStartRow:
y += height;
@@ -504,16 +523,16 @@ void ME_DrawParagraph(ME_Context *c, ME_DisplayItem *paragraph) {
visible = RectVisible(c->hDC, &rcPara);
if (visible) {
/* left margin */
- rc.left = c->rcView.left;
- rc.right = c->rcView.left+nMargWidth;
+ rc.left = c->rcView.left + bounds.left;
+ rc.right = xs;
rc.top = y;
rc.bottom = y+p->member.row.nHeight;
FillRect(c->hDC, &rc, c->editor->hbrBackground);
/* right margin */
rc.left = xe;
- rc.right = c->rcView.right;
+ rc.right = c->rcView.right - bounds.right;
FillRect(c->hDC, &rc, c->editor->hbrBackground);
- rc.left = c->rcView.left+nMargWidth;
+ rc.left = xs;
rc.right = xe;
FillRect(c->hDC, &rc, c->editor->hbrBackground);
}
@@ -529,7 +548,8 @@ void ME_DrawParagraph(ME_Context *c, ME_DisplayItem *paragraph) {
height = p->member.row.nHeight;
baseline = p->member.row.nBaseline;
- pno++;
+ if (!pno++)
+ xe += ME_twips2pointsX(c, para->pFmt->dxOffset);
break;
case diRun:
assert(para);
More information about the wine-patches
mailing list