commits
tags
#include "layout_cache.h"
#include <stdlib.h>
void layout_cache_init(LayoutCache *c) {
c->lines = NULL; c->lineCount = 0; c->lineCap = 0;
c->segs = NULL; c->segCount = 0; c->segCap = 0;
}
void layout_cache_reset(LayoutCache *c) {
c->lineCount = 0;
c->segCount = 0;
}
void layout_cache_free(LayoutCache *c) {
free(c->lines);
free(c->segs);
layout_cache_init(c);
}
int layout_cache_add_line(LayoutCache *c, int blockIndex, int lineInBlock, int srcStart, int srcEnd) {
if (c->lineCount >= c->lineCap) {
c->lineCap = c->lineCap > 0 ? c->lineCap * 2 : 64;
c->lines = realloc(c->lines, (size_t)c->lineCap * sizeof(CachedLine));
}
int idx = c->lineCount++;
CachedLine *l = &c->lines[idx];
l->blockIndex = blockIndex;
l->lineInBlock = lineInBlock;
l->srcStart = srcStart;
l->srcEnd = srcEnd;
l->globalLineIndex = idx;
l->segStart = c->segCount;
l->segEnd = c->segCount;
return idx;
}
int layout_cache_add_seg(LayoutCache *c, int lineIndex, int srcStart, int srcEnd, int fontId, int fontSize) {
if (c->segCount >= c->segCap) {
c->segCap = c->segCap > 0 ? c->segCap * 2 : 128;
c->segs = realloc(c->segs, (size_t)c->segCap * sizeof(CachedSegment));
}
int idx = c->segCount++;
CachedSegment *s = &c->segs[idx];
s->lineIndex = lineIndex;
s->srcStart = srcStart;
s->srcEnd = srcEnd;
s->globalSegIndex = idx;
s->fontId = fontId;
s->fontSize = fontSize;
return idx;
}
void layout_cache_close_line(LayoutCache *c, int lineIndex) {
c->lines[lineIndex].segEnd = c->segCount;
}