diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/gmdocument.c | 6 | ||||
-rw-r--r-- | src/gmdocument.h | 1 | ||||
-rw-r--r-- | src/ui/documentwidget.c | 35 |
3 files changed, 33 insertions, 9 deletions
diff --git a/src/gmdocument.c b/src/gmdocument.c index 38077689..5ff8c72f 100644 --- a/src/gmdocument.c +++ b/src/gmdocument.c | |||
@@ -2209,7 +2209,7 @@ const iGmRun *renderProgressive_GmDocument(const iGmDocument *d, const iGmRun *f | |||
2209 | setAnsiFlags_Text(d->theme.ansiEscapes); | 2209 | setAnsiFlags_Text(d->theme.ansiEscapes); |
2210 | const iGmRun *run = first; | 2210 | const iGmRun *run = first; |
2211 | while (isValidRun_GmDocument_(d, run)) { | 2211 | while (isValidRun_GmDocument_(d, run)) { |
2212 | if ((dir < 0 && bottom_Rect(run->visBounds) < visRangeY.start) || | 2212 | if ((dir < 0 && bottom_Rect(run->visBounds) <= visRangeY.start) || |
2213 | (dir > 0 && top_Rect(run->visBounds) >= visRangeY.end)) { | 2213 | (dir > 0 && top_Rect(run->visBounds) >= visRangeY.end)) { |
2214 | break; | 2214 | break; |
2215 | } | 2215 | } |
@@ -2260,6 +2260,10 @@ const iString *source_GmDocument(const iGmDocument *d) { | |||
2260 | return &d->source; | 2260 | return &d->source; |
2261 | } | 2261 | } |
2262 | 2262 | ||
2263 | iGmRunRange runRange_GmDocument(const iGmDocument *d) { | ||
2264 | return (iGmRunRange){ constFront_Array(&d->layout), constEnd_Array(&d->layout) }; | ||
2265 | } | ||
2266 | |||
2263 | size_t memorySize_GmDocument(const iGmDocument *d) { | 2267 | size_t memorySize_GmDocument(const iGmDocument *d) { |
2264 | return size_String(&d->unormSource) + | 2268 | return size_String(&d->unormSource) + |
2265 | size_String(&d->source) + | 2269 | size_String(&d->source) + |
diff --git a/src/gmdocument.h b/src/gmdocument.h index 37b99c68..0969794c 100644 --- a/src/gmdocument.h +++ b/src/gmdocument.h | |||
@@ -212,6 +212,7 @@ const iGmRun * renderProgressive_GmDocument(const iGmDocument *d, const iGmRun | |||
212 | iInt2 size_GmDocument (const iGmDocument *); | 212 | iInt2 size_GmDocument (const iGmDocument *); |
213 | const iArray * headings_GmDocument (const iGmDocument *); /* array of GmHeadings */ | 213 | const iArray * headings_GmDocument (const iGmDocument *); /* array of GmHeadings */ |
214 | const iString * source_GmDocument (const iGmDocument *); | 214 | const iString * source_GmDocument (const iGmDocument *); |
215 | iGmRunRange runRange_GmDocument (const iGmDocument *); | ||
215 | size_t memorySize_GmDocument (const iGmDocument *); /* bytes */ | 216 | size_t memorySize_GmDocument (const iGmDocument *); /* bytes */ |
216 | int warnings_GmDocument (const iGmDocument *); | 217 | int warnings_GmDocument (const iGmDocument *); |
217 | 218 | ||
diff --git a/src/ui/documentwidget.c b/src/ui/documentwidget.c index 7a1cdabc..dbe29c4e 100644 --- a/src/ui/documentwidget.c +++ b/src/ui/documentwidget.c | |||
@@ -1656,7 +1656,6 @@ static iBool render_DocumentView_(const iDocumentView *d, iDrawContext *ctx, iBo | |||
1656 | ctx->viewPos = init_I2(left_Rect(ctx->docBounds) - left_Rect(bounds), -buf->origin); | 1656 | ctx->viewPos = init_I2(left_Rect(ctx->docBounds) - left_Rect(bounds), -buf->origin); |
1657 | // printf(" buffer %zu: buf vis range %d...%d\n", i, bufVisRange.start, bufVisRange.end); | 1657 | // printf(" buffer %zu: buf vis range %d...%d\n", i, bufVisRange.start, bufVisRange.end); |
1658 | if (!prerenderExtra && !isEmpty_Range(&bufVisRange)) { | 1658 | if (!prerenderExtra && !isEmpty_Range(&bufVisRange)) { |
1659 | didDraw = iTrue; | ||
1660 | if (isEmpty_Rangei(buf->validRange)) { | 1659 | if (isEmpty_Rangei(buf->validRange)) { |
1661 | /* Fill the required currently visible range (vis). */ | 1660 | /* Fill the required currently visible range (vis). */ |
1662 | const iRangei bufVisRange = intersect_Rangei(bufRange, vis); | 1661 | const iRangei bufVisRange = intersect_Rangei(bufRange, vis); |
@@ -1669,26 +1668,46 @@ static iBool render_DocumentView_(const iDocumentView *d, iDrawContext *ctx, iBo | |||
1669 | extend_GmRunRange_(&meta->runsDrawn); | 1668 | extend_GmRunRange_(&meta->runsDrawn); |
1670 | buf->validRange = bufVisRange; | 1669 | buf->validRange = bufVisRange; |
1671 | // printf(" buffer %zu valid %d...%d\n", i, bufRange.start, bufRange.end); | 1670 | // printf(" buffer %zu valid %d...%d\n", i, bufRange.start, bufRange.end); |
1671 | didDraw = iTrue; | ||
1672 | } | 1672 | } |
1673 | } | 1673 | } |
1674 | else { | 1674 | else { |
1675 | /* Progressively fill the required runs. */ | 1675 | /* Progressively fill the required runs. */ |
1676 | if (meta->runsDrawn.start) { | 1676 | if (meta->runsDrawn.start && buf->validRange.start > bufRange.start) { |
1677 | beginTarget_Paint(p, buf->texture); | 1677 | beginTarget_Paint(p, buf->texture); |
1678 | meta->runsDrawn.start = renderProgressive_GmDocument(d->doc, meta->runsDrawn.start, | 1678 | iZap(ctx->runsDrawn); |
1679 | -1, iInvalidSize, | 1679 | const iGmRun *newStart = renderProgressive_GmDocument(d->doc, |
1680 | bufVisRange, | 1680 | meta->runsDrawn.start, |
1681 | drawRun_DrawContext_, | 1681 | -1, |
1682 | ctx); | 1682 | iInvalidSize, |
1683 | buf->validRange.start = bufVisRange.start; | 1683 | bufVisRange, |
1684 | drawRun_DrawContext_, | ||
1685 | ctx); | ||
1686 | if (ctx->runsDrawn.start) { | ||
1687 | /* Something was actually drawn, so update the valid range. */ | ||
1688 | const int newTop = top_Rect(ctx->runsDrawn.start->visBounds); | ||
1689 | if (newTop != buf->validRange.start) { | ||
1690 | didDraw = iTrue; | ||
1691 | // printf("render: valid:%d->%d run:%p->%p\n", | ||
1692 | // buf->validRange.start, newTop, | ||
1693 | // meta->runsDrawn.start, | ||
1694 | // ctx->runsDrawn.start); fflush(stdout); | ||
1695 | buf->validRange.start = newTop; | ||
1696 | } | ||
1697 | meta->runsDrawn.start = newStart; | ||
1698 | } | ||
1684 | } | 1699 | } |
1685 | if (meta->runsDrawn.end) { | 1700 | if (meta->runsDrawn.end) { |
1686 | beginTarget_Paint(p, buf->texture); | 1701 | beginTarget_Paint(p, buf->texture); |
1702 | iZap(ctx->runsDrawn); | ||
1687 | meta->runsDrawn.end = renderProgressive_GmDocument(d->doc, meta->runsDrawn.end, | 1703 | meta->runsDrawn.end = renderProgressive_GmDocument(d->doc, meta->runsDrawn.end, |
1688 | +1, iInvalidSize, | 1704 | +1, iInvalidSize, |
1689 | bufVisRange, | 1705 | bufVisRange, |
1690 | drawRun_DrawContext_, | 1706 | drawRun_DrawContext_, |
1691 | ctx); | 1707 | ctx); |
1708 | if (ctx->runsDrawn.start) { | ||
1709 | didDraw = iTrue; | ||
1710 | } | ||
1692 | buf->validRange.end = bufVisRange.end; | 1711 | buf->validRange.end = bufVisRange.end; |
1693 | } | 1712 | } |
1694 | } | 1713 | } |