foxygit / Hush Log in
commits tags

/src/layout_cache.c · 1.58 KB

raw
#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;
}