[PATCH v2 3/8] riched20: Move y-adjust to its own function.
Sergio Gómez Del Real
sdelreal at codeweavers.com
Thu Nov 29 07:44:50 CST 2018
Signed-off-by: Sergio Gómez Del Real <sdelreal at codeweavers.com>
---
dlls/riched20/wrap.c | 222 ++++++++++++++++++++++---------------------
1 file changed, 115 insertions(+), 107 deletions(-)
diff --git a/dlls/riched20/wrap.c b/dlls/riched20/wrap.c
index 18558258e5..e1ec692004 100644
--- a/dlls/riched20/wrap.c
+++ b/dlls/riched20/wrap.c
@@ -980,6 +980,120 @@ static void ME_MarkRepaintEnd(ME_DisplayItem *para,
*repaint_end = para;
}
+static void adjust_para_y(ME_DisplayItem *item, ME_Context *c, ME_DisplayItem *repaint_start, ME_DisplayItem *repaint_end)
+{
+ if (item->member.para.nFlags & MEPF_ROWSTART)
+ {
+ ME_DisplayItem *cell = ME_FindItemFwd(item, diCell);
+ ME_DisplayItem *endRowPara;
+ int borderWidth = 0;
+ cell->member.cell.pt = c->pt;
+ /* Offset the text by the largest top border width. */
+ while (cell->member.cell.next_cell)
+ {
+ borderWidth = max(borderWidth, cell->member.cell.border.top.width);
+ cell = cell->member.cell.next_cell;
+ }
+ endRowPara = ME_FindItemFwd(cell, diParagraph);
+ assert(endRowPara->member.para.nFlags & MEPF_ROWEND);
+ if (borderWidth > 0)
+ {
+ borderWidth = max(ME_twips2pointsY(c, borderWidth), 1);
+ while (cell)
+ {
+ cell->member.cell.yTextOffset = borderWidth;
+ cell = cell->member.cell.prev_cell;
+ }
+ c->pt.y += borderWidth;
+ }
+ if (endRowPara->member.para.fmt.dxStartIndent > 0)
+ {
+ int dxStartIndent = endRowPara->member.para.fmt.dxStartIndent;
+ cell = ME_FindItemFwd(item, diCell);
+ cell->member.cell.pt.x += ME_twips2pointsX(c, dxStartIndent);
+ c->pt.x = cell->member.cell.pt.x;
+ }
+ }
+ else if (item->member.para.nFlags & MEPF_ROWEND)
+ {
+ /* Set all the cells to the height of the largest cell */
+ ME_DisplayItem *startRowPara;
+ int prevHeight, nHeight, bottomBorder = 0;
+ ME_DisplayItem *cell = ME_FindItemBack(item, diCell);
+ item->member.para.nWidth = cell->member.cell.pt.x + cell->member.cell.nWidth;
+ if (!(item->member.para.next_para->member.para.nFlags & MEPF_ROWSTART))
+ {
+ /* Last row, the bottom border is added to the height. */
+ cell = cell->member.cell.prev_cell;
+ while (cell)
+ {
+ bottomBorder = max(bottomBorder, cell->member.cell.border.bottom.width);
+ cell = cell->member.cell.prev_cell;
+ }
+ bottomBorder = ME_twips2pointsY(c, bottomBorder);
+ cell = ME_FindItemBack(item, diCell);
+ }
+ prevHeight = cell->member.cell.nHeight;
+ nHeight = cell->member.cell.prev_cell->member.cell.nHeight + bottomBorder;
+ cell->member.cell.nHeight = nHeight;
+ item->member.para.nHeight = nHeight;
+ cell = cell->member.cell.prev_cell;
+ cell->member.cell.nHeight = nHeight;
+ while (cell->member.cell.prev_cell)
+ {
+ cell = cell->member.cell.prev_cell;
+ cell->member.cell.nHeight = nHeight;
+ }
+ /* Also set the height of the start row paragraph */
+ startRowPara = ME_FindItemBack(cell, diParagraph);
+ startRowPara->member.para.nHeight = nHeight;
+ c->pt.x = startRowPara->member.para.pt.x;
+ c->pt.y = cell->member.cell.pt.y + nHeight;
+ if (prevHeight < nHeight)
+ {
+ /* The height of the cells has grown, so invalidate the bottom of
+ * the cells. */
+ ME_MarkRepaintEnd(item, &repaint_start, &repaint_end);
+ cell = ME_FindItemBack(item, diCell);
+ while (cell)
+ {
+ ME_MarkRepaintEnd(ME_FindItemBack(cell, diParagraph), &repaint_start, &repaint_end);
+ cell = cell->member.cell.prev_cell;
+ }
+ }
+ }
+ else if (item->member.para.pCell &&
+ item->member.para.pCell != item->member.para.next_para->member.para.pCell)
+ {
+ /* The next paragraph is in the next cell in the table row. */
+ ME_Cell *cell = &item->member.para.pCell->member.cell;
+ cell->nHeight = c->pt.y + item->member.para.nHeight - cell->pt.y;
+
+ /* Propagate the largest height to the end so that it can be easily
+ * sent back to all the cells at the end of the row. */
+ if (cell->prev_cell)
+ cell->nHeight = max(cell->nHeight, cell->prev_cell->member.cell.nHeight);
+
+ c->pt.x = cell->pt.x + cell->nWidth;
+ c->pt.y = cell->pt.y;
+ cell->next_cell->member.cell.pt = c->pt;
+ if (!(item->member.para.next_para->member.para.nFlags & MEPF_ROWEND))
+ c->pt.y += cell->yTextOffset;
+ }
+ else
+ {
+ if (item->member.para.pCell)
+ {
+ /* Next paragraph in the same cell. */
+ c->pt.x = item->member.para.pCell->member.cell.pt.x;
+ }
+ else
+ /* Normal paragraph */
+ c->pt.x = 0;
+ c->pt.y += item->member.para.nHeight;
+ }
+}
+
BOOL ME_WrapMarkedParagraphs(ME_TextEditor *editor)
{
ME_DisplayItem *item;
@@ -1004,113 +1118,7 @@ BOOL ME_WrapMarkedParagraphs(ME_TextEditor *editor)
if (bRedraw)
ME_MarkRepaintEnd(item, &repaint_start, &repaint_end);
- if (item->member.para.nFlags & MEPF_ROWSTART)
- {
- ME_DisplayItem *cell = ME_FindItemFwd(item, diCell);
- ME_DisplayItem *endRowPara;
- int borderWidth = 0;
- cell->member.cell.pt = c.pt;
- /* Offset the text by the largest top border width. */
- while (cell->member.cell.next_cell) {
- borderWidth = max(borderWidth, cell->member.cell.border.top.width);
- cell = cell->member.cell.next_cell;
- }
- endRowPara = ME_FindItemFwd(cell, diParagraph);
- assert(endRowPara->member.para.nFlags & MEPF_ROWEND);
- if (borderWidth > 0)
- {
- borderWidth = max(ME_twips2pointsY(&c, borderWidth), 1);
- while (cell) {
- cell->member.cell.yTextOffset = borderWidth;
- cell = cell->member.cell.prev_cell;
- }
- c.pt.y += borderWidth;
- }
- if (endRowPara->member.para.fmt.dxStartIndent > 0)
- {
- int dxStartIndent = endRowPara->member.para.fmt.dxStartIndent;
- cell = ME_FindItemFwd(item, diCell);
- cell->member.cell.pt.x += ME_twips2pointsX(&c, dxStartIndent);
- c.pt.x = cell->member.cell.pt.x;
- }
- }
- else if (item->member.para.nFlags & MEPF_ROWEND)
- {
- /* Set all the cells to the height of the largest cell */
- ME_DisplayItem *startRowPara;
- int prevHeight, nHeight, bottomBorder = 0;
- ME_DisplayItem *cell = ME_FindItemBack(item, diCell);
- item->member.para.nWidth = cell->member.cell.pt.x + cell->member.cell.nWidth;
- if (!(item->member.para.next_para->member.para.nFlags & MEPF_ROWSTART))
- {
- /* Last row, the bottom border is added to the height. */
- cell = cell->member.cell.prev_cell;
- while (cell)
- {
- bottomBorder = max(bottomBorder, cell->member.cell.border.bottom.width);
- cell = cell->member.cell.prev_cell;
- }
- bottomBorder = ME_twips2pointsY(&c, bottomBorder);
- cell = ME_FindItemBack(item, diCell);
- }
- prevHeight = cell->member.cell.nHeight;
- nHeight = cell->member.cell.prev_cell->member.cell.nHeight + bottomBorder;
- cell->member.cell.nHeight = nHeight;
- item->member.para.nHeight = nHeight;
- cell = cell->member.cell.prev_cell;
- cell->member.cell.nHeight = nHeight;
- while (cell->member.cell.prev_cell)
- {
- cell = cell->member.cell.prev_cell;
- cell->member.cell.nHeight = nHeight;
- }
- /* Also set the height of the start row paragraph */
- startRowPara = ME_FindItemBack(cell, diParagraph);
- startRowPara->member.para.nHeight = nHeight;
- c.pt.x = startRowPara->member.para.pt.x;
- c.pt.y = cell->member.cell.pt.y + nHeight;
- if (prevHeight < nHeight)
- {
- /* The height of the cells has grown, so invalidate the bottom of
- * the cells. */
- ME_MarkRepaintEnd(item, &repaint_start, &repaint_end);
- cell = ME_FindItemBack(item, diCell);
- while (cell) {
- ME_MarkRepaintEnd(ME_FindItemBack(cell, diParagraph), &repaint_start, &repaint_end);
- cell = cell->member.cell.prev_cell;
- }
- }
- }
- else if (item->member.para.pCell &&
- item->member.para.pCell != item->member.para.next_para->member.para.pCell)
- {
- /* The next paragraph is in the next cell in the table row. */
- ME_Cell *cell = &item->member.para.pCell->member.cell;
- cell->nHeight = c.pt.y + item->member.para.nHeight - cell->pt.y;
-
- /* Propagate the largest height to the end so that it can be easily
- * sent back to all the cells at the end of the row. */
- if (cell->prev_cell)
- cell->nHeight = max(cell->nHeight, cell->prev_cell->member.cell.nHeight);
-
- c.pt.x = cell->pt.x + cell->nWidth;
- c.pt.y = cell->pt.y;
- cell->next_cell->member.cell.pt = c.pt;
- if (!(item->member.para.next_para->member.para.nFlags & MEPF_ROWEND))
- c.pt.y += cell->yTextOffset;
- }
- else
- {
- if (item->member.para.pCell) {
- /* Next paragraph in the same cell. */
- c.pt.x = item->member.para.pCell->member.cell.pt.x;
- } else {
- /* Normal paragraph */
- c.pt.x = 0;
- }
- c.pt.y += item->member.para.nHeight;
- }
-
+ adjust_para_y(item, &c, repaint_start, repaint_end);
totalWidth = max(totalWidth, item->member.para.nWidth);
item = item->member.para.next_para;
}
--
2.17.1
More information about the wine-devel
mailing list