richedit: Add paragraph field to wrap context to avoid searching for it.
Dylan Smith
dylan.ah.smith at gmail.com
Fri Feb 6 00:09:56 CST 2009
More case of searching for the paragraph through the linked list when
is was already previously available. Since each wrap context is used
for wrapping each paragraph, I decided to add the reference to the
paragarph in the structure.
---
dlls/riched20/editstr.h | 1 +
dlls/riched20/wrap.c | 18 ++++++++++--------
2 files changed, 11 insertions(+), 8 deletions(-)
-------------- next part --------------
diff --git a/dlls/riched20/editstr.h b/dlls/riched20/editstr.h
index 63ef7f9..ac36e0e 100644
--- a/dlls/riched20/editstr.h
+++ b/dlls/riched20/editstr.h
@@ -414,6 +414,7 @@ typedef struct tagME_WrapContext
int nRow;
POINT pt;
BOOL bOverflown, bWordWrap;
+ ME_DisplayItem *pPara;
ME_DisplayItem *pRowStart;
ME_DisplayItem *pLastSplittableRun;
diff --git a/dlls/riched20/wrap.c b/dlls/riched20/wrap.c
index a2da5eb..952f208 100644
--- a/dlls/riched20/wrap.c
+++ b/dlls/riched20/wrap.c
@@ -42,10 +42,11 @@ static ME_DisplayItem *ME_MakeRow(int height, int baseline, int width)
return item;
}
-static void ME_BeginRow(ME_WrapContext *wc, ME_DisplayItem *para)
+static void ME_BeginRow(ME_WrapContext *wc)
{
PARAFORMAT2 *pFmt;
- assert(para && para->type == diParagraph);
+ ME_DisplayItem *para = wc->pPara;
+
pFmt = para->member.para.pFmt;
wc->pRowStart = NULL;
wc->bOverflown = FALSE;
@@ -94,7 +95,7 @@ static void ME_InsertRowStart(ME_WrapContext *wc, const ME_DisplayItem *pEnd)
int ascent = 0, descent = 0, width=0, shift = 0, align = 0;
PARAFORMAT2 *pFmt;
/* wrap text */
- para = ME_GetParagraph(wc->pRowStart);
+ para = wc->pPara;
pFmt = para->member.para.pFmt;
for (p = pEnd->prev; p!=wc->pRowStart->prev; p = p->prev)
@@ -162,12 +163,12 @@ static void ME_InsertRowStart(ME_WrapContext *wc, const ME_DisplayItem *pEnd)
ME_InsertBefore(wc->pRowStart, row);
wc->nRow++;
wc->pt.y += row->member.row.nHeight;
- ME_BeginRow(wc, para);
+ ME_BeginRow(wc);
}
static void ME_WrapEndParagraph(ME_WrapContext *wc, ME_DisplayItem *p)
{
- ME_DisplayItem *para = p->member.para.prev_para;
+ ME_DisplayItem *para = wc->pPara;
PARAFORMAT2 *pFmt = para->member.para.pFmt;
if (wc->pRowStart)
ME_InsertRowStart(wc, p);
@@ -180,7 +181,7 @@ static void ME_WrapEndParagraph(ME_WrapContext *wc, ME_DisplayItem *p)
}
/*
- p = p->member.para.prev_para->next;
+ p = para->next;
while(p) {
if (p->type == diParagraph || p->type == diTextEnd)
return;
@@ -200,7 +201,7 @@ static void ME_WrapSizeRun(ME_WrapContext *wc, ME_DisplayItem *p)
ME_UpdateRunFlags(wc->context->editor, &p->member.run);
- ME_CalcRunExtent(wc->context, &ME_GetParagraph(p)->member.para,
+ ME_CalcRunExtent(wc->context, &wc->pPara->member.para,
wc->nRow ? wc->nLeftMargin : wc->nFirstMargin, &p->member.run);
}
@@ -473,6 +474,7 @@ static void ME_WrapTextParagraph(ME_Context *c, ME_DisplayItem *tp) {
pFmt = tp->member.para.pFmt;
wc.context = c;
+ wc.pPara = tp;
/* wc.para_style = tp->member.para.style; */
wc.style = NULL;
if (tp->member.para.nFlags & MEPF_ROWEND) {
@@ -511,7 +513,7 @@ static void ME_WrapTextParagraph(ME_Context *c, ME_DisplayItem *tp) {
linespace = ME_GetParaLineSpace(c, &tp->member.para);
- ME_BeginRow(&wc, tp);
+ ME_BeginRow(&wc);
for (p = tp->next; p!=tp->member.para.next_para; ) {
assert(p->type != diStartRow);
if (p->type == diRun) {
More information about the wine-patches
mailing list