optimize cache_get n shiet
This commit is contained in:
parent
ae8bbc0077
commit
9de467eae9
@ -14,4 +14,4 @@ util.o: util.c util.h
|
|||||||
test: cache.o font.o hash.o main.o ren.o util.o
|
test: cache.o font.o hash.o main.o ren.o util.o
|
||||||
${CC} ${LDFLAGS} -o test cache.o font.o hash.o main.o ren.o util.o
|
${CC} ${LDFLAGS} -o test cache.o font.o hash.o main.o ren.o util.o
|
||||||
clean:
|
clean:
|
||||||
rm -f cache.o font.o hash.o main.o ren.o util.o
|
rm -f test cache.o font.o hash.o main.o ren.o util.o
|
||||||
|
@ -70,24 +70,14 @@ unsigned int cache_get(void)
|
|||||||
{
|
{
|
||||||
uint32_t x = 0;
|
uint32_t x = 0;
|
||||||
// find an open spot in the cache
|
// find an open spot in the cache
|
||||||
// TODO: use __builtin_clz to speed this up
|
for (int b = 0; b < _BSIZE; b++) {
|
||||||
for (; x < CACHE_SIZE; x++) {
|
if (bitmap[b] == 0) x = 64;
|
||||||
//printf("testing spot %d\n", x);
|
else x = __builtin_clzll(bitmap[b]);
|
||||||
//print_byte(bitmap[0]>>56);
|
x = 64-x;
|
||||||
//print_byte(bitmap[0]>>48);
|
if (!B_TEST(x+64*b))
|
||||||
//print_byte(bitmap[0]>>40);
|
return x+64*b;
|
||||||
//print_byte(bitmap[0]>>32);
|
|
||||||
//print_byte(bitmap[0]>>24);
|
|
||||||
//print_byte(bitmap[0]>>16);
|
|
||||||
//print_byte(bitmap[0]>>8);
|
|
||||||
//print_byte(bitmap[0]);
|
|
||||||
//printf("%lx", bitmap[i]);
|
|
||||||
//printf("\n");
|
|
||||||
|
|
||||||
if (!B_TEST(x))
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
return x;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -46,7 +46,8 @@ struct font_atlas * font_init(void)
|
|||||||
|
|
||||||
|
|
||||||
// loads a font into memory, storing all the ASCII characters in the atlas, each font
|
// loads a font into memory, storing all the ASCII characters in the atlas, each font
|
||||||
// atlas structure holds glyphs of a specific size
|
// atlas structure holds glyphs of a specific size in pixels
|
||||||
|
// NOTE: size includes ascend and descend (so 12 does not mean that 'A' is 12px tall)
|
||||||
int font_load(struct font_atlas *atlas, const char *path, int size)
|
int font_load(struct font_atlas *atlas, const char *path, int size)
|
||||||
{
|
{
|
||||||
if (!atlas || !path)
|
if (!atlas || !path)
|
||||||
@ -62,9 +63,9 @@ int font_load(struct font_atlas *atlas, const char *path, int size)
|
|||||||
int ascent, descent, linegap, baseline;
|
int ascent, descent, linegap, baseline;
|
||||||
int x0,y0,x1,y1;
|
int x0,y0,x1,y1;
|
||||||
float scale;
|
float scale;
|
||||||
scale = stbtt_ScaleForPixelHeight(&(PRIV(atlas)->stb), size);
|
|
||||||
stbtt_GetFontVMetrics(&(PRIV(atlas)->stb), &ascent, &descent, &linegap);
|
stbtt_GetFontVMetrics(&(PRIV(atlas)->stb), &ascent, &descent, &linegap);
|
||||||
stbtt_GetFontBoundingBox(&(PRIV(atlas)->stb), &x0, &y0, &x1, &y1);
|
stbtt_GetFontBoundingBox(&(PRIV(atlas)->stb), &x0, &y0, &x1, &y1);
|
||||||
|
scale = stbtt_ScaleForPixelHeight(&(PRIV(atlas)->stb), size);
|
||||||
baseline = scale * -y0;
|
baseline = scale * -y0;
|
||||||
atlas->glyph_max_w = (scale*x1) - (scale*x0);
|
atlas->glyph_max_w = (scale*x1) - (scale*x0);
|
||||||
atlas->glyph_max_h = (baseline+scale*y1) - (baseline+scale*y0);
|
atlas->glyph_max_h = (baseline+scale*y1) - (baseline+scale*y0);
|
||||||
|
@ -31,7 +31,7 @@ done
|
|||||||
mainrule='test: '
|
mainrule='test: '
|
||||||
linkcmd=' ${CC} ${LDFLAGS} -o test '
|
linkcmd=' ${CC} ${LDFLAGS} -o test '
|
||||||
cleanrule='clean:
|
cleanrule='clean:
|
||||||
rm -f '
|
rm -f test '
|
||||||
while IFS="" read -r line; do
|
while IFS="" read -r line; do
|
||||||
mainrule="$mainrule $line"
|
mainrule="$mainrule $line"
|
||||||
linkcmd="$linkcmd $line"
|
linkcmd="$linkcmd $line"
|
||||||
|
@ -26,7 +26,7 @@ int main(void)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *str = "Ciao Mamma!\nprova: òçà°ù§|¬³¼$£ì";
|
const char *str = "Ciao Mamma!\nprova: òçà°ù§|¬³¼$£ì\t";
|
||||||
|
|
||||||
SDL_Event e;
|
SDL_Event e;
|
||||||
while(1) {
|
while(1) {
|
||||||
@ -38,11 +38,11 @@ int main(void)
|
|||||||
case SDL_WINDOWEVENT_RESIZED:
|
case SDL_WINDOWEVENT_RESIZED:
|
||||||
case SDL_WINDOWEVENT_SIZE_CHANGED:
|
case SDL_WINDOWEVENT_SIZE_CHANGED:
|
||||||
ren_update_viewport(e.window.data1, e.window.data2);
|
ren_update_viewport(e.window.data1, e.window.data2);
|
||||||
ren_render_text(str, 0, 0, 100, 100, 12);
|
ren_render_text(str, 0, 0, 200, 100, 12);
|
||||||
SDL_GL_SwapWindow(win);
|
SDL_GL_SwapWindow(win);
|
||||||
break;
|
break;
|
||||||
case SDL_WINDOWEVENT_EXPOSED:
|
case SDL_WINDOWEVENT_EXPOSED:
|
||||||
ren_render_text(str, 0, 0, 100, 100, 12);
|
ren_render_text(str, 0, 0, 200, 100, 12);
|
||||||
SDL_GL_SwapWindow(win);
|
SDL_GL_SwapWindow(win);
|
||||||
break;
|
break;
|
||||||
default: break;
|
default: break;
|
||||||
|
@ -391,7 +391,7 @@ static int ren_draw_font_stack(void)
|
|||||||
GL(glScissor(0, 0, ren.width, ren.height))
|
GL(glScissor(0, 0, ren.width, ren.height))
|
||||||
GL(glClear(GL_COLOR_BUFFER_BIT));
|
GL(glClear(GL_COLOR_BUFFER_BIT));
|
||||||
// this has caused me some trouble, convert from image coordiates to viewport
|
// this has caused me some trouble, convert from image coordiates to viewport
|
||||||
//GL(glScissor(ren.s_x, ren.height-ren.s_y-ren.s_h, ren.s_w, ren.s_h))
|
GL(glScissor(ren.s_x, ren.height-ren.s_y-ren.s_h, ren.s_w, ren.s_h))
|
||||||
GL(glUniform2i(ren.viewsize_loc, ren.width, ren.height))
|
GL(glUniform2i(ren.viewsize_loc, ren.width, ren.height))
|
||||||
GL(glUniform2i(ren.texturesize_loc, ren.font->width, ren.font->height))
|
GL(glUniform2i(ren.texturesize_loc, ren.font->width, ren.font->height))
|
||||||
|
|
||||||
@ -480,9 +480,9 @@ int ren_render_text(const char *str, int x, int y, int w, int h, int size)
|
|||||||
uint_least32_t cp;
|
uint_least32_t cp;
|
||||||
int updated, gx = x, gy = y;
|
int updated, gx = x, gy = y;
|
||||||
struct v_text v;
|
struct v_text v;
|
||||||
printf("rendering text: %s\n", str);
|
|
||||||
for (off = 0; (ret = grapheme_decode_utf8(str+off, SIZE_MAX, &cp)) > 0 && cp != 0; off += ret) {
|
for (off = 0; (ret = grapheme_decode_utf8(str+off, SIZE_MAX, &cp)) > 0 && cp != 0; off += ret) {
|
||||||
// skip special characters that render a box (not present in font)
|
// skip special characters that render a box (not present in font)
|
||||||
|
// FIXME: handle tab
|
||||||
if (iscntrl(cp)) goto skip_render;
|
if (iscntrl(cp)) goto skip_render;
|
||||||
g = font_get_glyph_texture(ren.font, cp, &updated);
|
g = font_get_glyph_texture(ren.font, cp, &updated);
|
||||||
if (!g) REN_RET(-1, REN_FONT);
|
if (!g) REN_RET(-1, REN_FONT);
|
||||||
@ -531,9 +531,8 @@ int ren_render_text(const char *str, int x, int y, int w, int h, int size)
|
|||||||
vtstack_push(&ren.font_stack, &v);
|
vtstack_push(&ren.font_stack, &v);
|
||||||
|
|
||||||
// TODO: possible kerning needs to be applied here
|
// TODO: possible kerning needs to be applied here
|
||||||
// FIXME: advance is too large
|
// TODO: handle other unicode control characters such as the
|
||||||
//gx += c.w + c.a;
|
// right-to-left isolate (\u2067)
|
||||||
//gx += c.w + c.x + 1;
|
|
||||||
gx += c.x + c.a;
|
gx += c.x + c.a;
|
||||||
skip_render:
|
skip_render:
|
||||||
switch (cp) {
|
switch (cp) {
|
||||||
@ -542,7 +541,7 @@ int ren_render_text(const char *str, int x, int y, int w, int h, int size)
|
|||||||
break;
|
break;
|
||||||
case '\n':
|
case '\n':
|
||||||
// TODO: encode and/or store line height
|
// TODO: encode and/or store line height
|
||||||
gy = ren.font->glyph_max_h;
|
gy += ren.font->glyph_max_h;
|
||||||
gx = x;
|
gx = x;
|
||||||
break;
|
break;
|
||||||
default: break;
|
default: break;
|
||||||
|
Loading…
Reference in New Issue
Block a user