static void ME_InsertRowStart(ME_WrapContext *wc, const ME_DisplayItem *pEnd) { ME_DisplayItem *p, *row, *para; int ascent = 0, descent = 0, width=0, shift = 0, align = 0; /* wrap text */ para = ME_GetParagraph(wc->pRowStart); for (p = wc->pRowStart; p!=pEnd; p = p->next) { /* ENDPARA run shouldn't affect row height, except if it's the only run in the paragraph */ if (p->type==diRun && ((p==wc->pRowStart) || !(p->member.run.nFlags & MERF_ENDPARA))) { /* FIXME add more run types */ if (p->member.run.nAscent>ascent) ascent = p->member.run.nAscent; if (p->member.run.nDescent>descent) descent = p->member.run.nDescent; if (!(p->member.run.nFlags & (MERF_ENDPARA|MERF_SKIPPED))) width += p->member.run.nWidth; } } row = ME_MakeRow(ascent+descent, ascent, width); row->member.row.nYPos = wc->pt.y; row->member.row.nLMargin = (!wc->nRow ? wc->nFirstMargin : wc->nLeftMargin); row->member.row.nRMargin = wc->nRightMargin; assert(para->member.para.pFmt->dwMask & PFM_ALIGNMENT); align = para->member.para.pFmt->wAlignment; if (align == PFA_CENTER) shift = (wc->nAvailWidth-width)/2; if (align == PFA_RIGHT) shift = wc->nAvailWidth-width; for (p = wc->pRowStart; p!=pEnd; p = p->next) { if (p->type==diRun) { /* FIXME add more run types */ p->member.run.pt.x += row->member.row.nLMargin+shift; } } ME_InsertBefore(wc->pRowStart, row); wc->nRow++; wc->pt.y += ascent+descent; ME_BeginRow(wc); }
static void ME_InsertRowStart(ME_WrapContext *wc, const ME_DisplayItem *pEnd) { ME_DisplayItem *p, *row; ME_Paragraph *para = &wc->pPara->member.para; BOOL bSkippingSpaces = TRUE; int ascent = 0, descent = 0, width=0, shift = 0, align = 0; /* wrap text */ for (p = pEnd->prev; p!=wc->pRowStart->prev; p = p->prev) { /* ENDPARA run shouldn't affect row height, except if it's the only run in the paragraph */ if (p->type==diRun && ((p==wc->pRowStart) || !(p->member.run.nFlags & MERF_ENDPARA))) { /* FIXME add more run types */ if (p->member.run.nAscent>ascent) ascent = p->member.run.nAscent; if (p->member.run.nDescent>descent) descent = p->member.run.nDescent; if (bSkippingSpaces) { /* Exclude space characters from run width. * Other whitespace or delimiters are not treated this way. */ int len = p->member.run.len; WCHAR *text = get_text( &p->member.run, len - 1 ); assert (len); if (~p->member.run.nFlags & MERF_GRAPHICS) while (len && *(text--) == ' ') len--; if (len) { if (len == p->member.run.len) width += p->member.run.nWidth; else width += ME_PointFromCharContext( wc->context, &p->member.run, len, FALSE ); } bSkippingSpaces = !len; } else if (!(p->member.run.nFlags & MERF_ENDPARA)) width += p->member.run.nWidth; } } para->nWidth = max(para->nWidth, width); row = ME_MakeRow(ascent+descent, ascent, width); if (wc->context->editor->bEmulateVersion10 && /* v1.0 - 3.0 */ (para->pFmt->dwMask & PFM_TABLE) && (para->pFmt->wEffects & PFE_TABLE)) { /* The text was shifted down in ME_BeginRow so move the wrap context * back to where it should be. */ wc->pt.y--; /* The height of the row is increased by the borders. */ row->member.row.nHeight += 2; } row->member.row.pt = wc->pt; row->member.row.nLMargin = (!wc->nRow ? wc->nFirstMargin : wc->nLeftMargin); row->member.row.nRMargin = wc->nRightMargin; assert(para->pFmt->dwMask & PFM_ALIGNMENT); align = para->pFmt->wAlignment; if (align == PFA_CENTER) shift = max((wc->nAvailWidth-width)/2, 0); if (align == PFA_RIGHT) shift = max(wc->nAvailWidth-width, 0); if (para->nFlags & MEPF_COMPLEX) layout_row( wc->pRowStart, pEnd ); row->member.row.pt.x = row->member.row.nLMargin + shift; for (p = wc->pRowStart; p!=pEnd; p = p->next) { if (p->type==diRun) { /* FIXME add more run types */ p->member.run.pt.x += row->member.row.nLMargin+shift; } } ME_InsertBefore(wc->pRowStart, row); wc->nRow++; wc->pt.y += row->member.row.nHeight; ME_BeginRow(wc); }