mirror of
https://gitlab.com/bztsrc/posix-uefi.git
synced 2024-12-28 06:55:08 +01:00
Updated ssfn.h and checks with latest compilers and -ansi -pendantic
This commit is contained in:
parent
1431b327d2
commit
5044fe15a7
13 changed files with 80 additions and 135 deletions
|
@ -69,8 +69,6 @@ int main(int argc, char **argv)
|
||||||
efi_status_t status;
|
efi_status_t status;
|
||||||
efi_guid_t gopGuid = EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID;
|
efi_guid_t gopGuid = EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID;
|
||||||
efi_gop_t *gop = NULL;
|
efi_gop_t *gop = NULL;
|
||||||
efi_gop_mode_info_t *info = NULL;
|
|
||||||
uintn_t isiz = sizeof(efi_gop_mode_info_t);
|
|
||||||
FILE *f;
|
FILE *f;
|
||||||
long int size;
|
long int size;
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* ssfn.h
|
* ssfn.h
|
||||||
|
* https://gitlab.com/bztsrc/scalable-font2
|
||||||
*
|
*
|
||||||
* Copyright (C) 2020 bzt (bztsrc@gitlab)
|
* Copyright (C) 2020 bzt (bztsrc@gitlab)
|
||||||
*
|
*
|
||||||
|
@ -103,11 +104,11 @@ typedef struct {
|
||||||
uint8_t height; /* overall height of the font */
|
uint8_t height; /* overall height of the font */
|
||||||
uint8_t baseline; /* horizontal baseline in grid pixels */
|
uint8_t baseline; /* horizontal baseline in grid pixels */
|
||||||
uint8_t underline; /* position of under line in grid pixels */
|
uint8_t underline; /* position of under line in grid pixels */
|
||||||
uint16_t fragments_offs; /* offset of fragments table relative to magic */
|
uint16_t fragments_offs; /* offset of fragments table */
|
||||||
uint32_t characters_offs; /* characters table offset relative to magic */
|
uint32_t characters_offs; /* characters table offset */
|
||||||
uint32_t ligature_offs; /* ligatures table offset relative to magic */
|
uint32_t ligature_offs; /* ligatures table offset */
|
||||||
uint32_t kerning_offs; /* kerning table offset relative to magic */
|
uint32_t kerning_offs; /* kerning table offset */
|
||||||
uint32_t cmap_offs; /* color map offset relative to magic */
|
uint32_t cmap_offs; /* color map offset */
|
||||||
} __attribute__((packed)) ssfn_font_t;
|
} __attribute__((packed)) ssfn_font_t;
|
||||||
|
|
||||||
/***** renderer API *****/
|
/***** renderer API *****/
|
||||||
|
@ -198,7 +199,7 @@ typedef struct {
|
||||||
char **bufs; /* allocated extra buffers */
|
char **bufs; /* allocated extra buffers */
|
||||||
#endif
|
#endif
|
||||||
ssfn_chr_t *rc; /* pointer to current character */
|
ssfn_chr_t *rc; /* pointer to current character */
|
||||||
int numbuf, lenbuf, np, ap;
|
int numbuf, lenbuf, np, ap, ox, oy, ax;
|
||||||
int mx, my, lx, ly; /* move to coordinates, last coordinates */
|
int mx, my, lx, ly; /* move to coordinates, last coordinates */
|
||||||
int len[5]; /* number of fonts in registry */
|
int len[5]; /* number of fonts in registry */
|
||||||
int family; /* required family */
|
int family; /* required family */
|
||||||
|
@ -218,7 +219,7 @@ uint32_t ssfn_utf8(char **str);
|
||||||
int ssfn_load(ssfn_t *ctx, const void *data); /* add an SSFN to context */
|
int ssfn_load(ssfn_t *ctx, const void *data); /* add an SSFN to context */
|
||||||
int ssfn_select(ssfn_t *ctx, int family, const char *name, int style, int size); /* select font to use */
|
int ssfn_select(ssfn_t *ctx, int family, const char *name, int style, int size); /* select font to use */
|
||||||
int ssfn_render(ssfn_t *ctx, ssfn_buf_t *dst, const char *str); /* render a glyph to a pixel buffer */
|
int ssfn_render(ssfn_t *ctx, ssfn_buf_t *dst, const char *str); /* render a glyph to a pixel buffer */
|
||||||
int ssfn_bbox(ssfn_t *ctx, const char *str, int *w, int *h, int *left, int *top); /* get bounding box of a rendered string */
|
int ssfn_bbox(ssfn_t *ctx, const char *str, int *w, int *h, int *left, int *top); /* get bounding box */
|
||||||
ssfn_buf_t *ssfn_text(ssfn_t *ctx, const char *str, unsigned int fg); /* renders text to a newly allocated buffer */
|
ssfn_buf_t *ssfn_text(ssfn_t *ctx, const char *str, unsigned int fg); /* renders text to a newly allocated buffer */
|
||||||
int ssfn_mem(ssfn_t *ctx); /* return how much memory is used */
|
int ssfn_mem(ssfn_t *ctx); /* return how much memory is used */
|
||||||
void ssfn_free(ssfn_t *ctx); /* free context */
|
void ssfn_free(ssfn_t *ctx); /* free context */
|
||||||
|
@ -266,7 +267,7 @@ uint32_t ssfn_utf8(char **s)
|
||||||
if(!(**s & 8)) { c = ((**s & 0x7)<<18)|((*(*s+1) & 0x3F)<<12)|((*(*s+2) & 0x3F)<<6)|(*(*s+3) & 0x3F); *s += 3; }
|
if(!(**s & 8)) { c = ((**s & 0x7)<<18)|((*(*s+1) & 0x3F)<<12)|((*(*s+2) & 0x3F)<<6)|(*(*s+3) & 0x3F); *s += 3; }
|
||||||
else c = 0;
|
else c = 0;
|
||||||
}
|
}
|
||||||
*s += 1; /* *s++ is not what you think */
|
(*s)++;
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -289,7 +290,7 @@ extern int memcmp (const void *__s1, const void *__s2, size_t __n) __THROW;
|
||||||
extern void *memset (void *__s, int __c, size_t __n) __THROW;
|
extern void *memset (void *__s, int __c, size_t __n) __THROW;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Clang does not have built-in versions but gcc has */
|
/* Clang does not have built-ins */
|
||||||
# ifndef SSFN_memcmp
|
# ifndef SSFN_memcmp
|
||||||
# ifdef __builtin_memcmp
|
# ifdef __builtin_memcmp
|
||||||
# define SSFN_memcmp __builtin_memcmp
|
# define SSFN_memcmp __builtin_memcmp
|
||||||
|
@ -419,7 +420,6 @@ static void _ssfn_b(ssfn_t *ctx, int p,int h, int x0,int y0, int x1,int y1, int
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef SSFN_MAXLINES
|
#ifndef SSFN_MAXLINES
|
||||||
/* free internal cache */
|
|
||||||
static void _ssfn_fc(ssfn_t *ctx)
|
static void _ssfn_fc(ssfn_t *ctx)
|
||||||
{
|
{
|
||||||
int i, j, k;
|
int i, j, k;
|
||||||
|
@ -971,7 +971,7 @@ int ssfn_render(ssfn_t *ctx, ssfn_buf_t *dst, const char *str)
|
||||||
uint32_t unicode, P, O, *Op, *Ol;
|
uint32_t unicode, P, O, *Op, *Ol;
|
||||||
unsigned long int sR, sG, sB, sA;
|
unsigned long int sR, sG, sB, sA;
|
||||||
int ret = 0, i, j, k, l, p, m, n, o, s, x, y, w, h, a, A, b, B, nr, uix, uax;
|
int ret = 0, i, j, k, l, p, m, n, o, s, x, y, w, h, a, A, b, B, nr, uix, uax;
|
||||||
int ox, oy, y0, y1, Y0, Y1, x0, x1, X0, X1, X2, xs, ys, yp, pc, af, fB, fG, fR, fA, bB, bG, bR;
|
int ox, oy, y0, y1, Y0, Y1, x0, x1, X0, X1, X2, xs, ys, yp, pc, fB, fG, fR, fA, bB, bG, bR, dB, dG, dR, dA;
|
||||||
#ifdef SSFN_PROFILING
|
#ifdef SSFN_PROFILING
|
||||||
struct timeval tv0, tv1, tvd;
|
struct timeval tv0, tv1, tvd;
|
||||||
gettimeofday(&tv0, NULL);
|
gettimeofday(&tv0, NULL);
|
||||||
|
@ -1054,7 +1054,7 @@ again: if(p >= SSFN_FAMILY_BYNAME) { n = 0; m = 4; } else n = m = p;
|
||||||
h = ctx->style & SSFN_STYLE_NOAA ? ctx->size : (ctx->size > ctx->f->height ? (ctx->size + 4) & ~3 : ctx->f->height);
|
h = ctx->style & SSFN_STYLE_NOAA ? ctx->size : (ctx->size > ctx->f->height ? (ctx->size + 4) & ~3 : ctx->f->height);
|
||||||
ci = (ctx->style & SSFN_STYLE_ITALIC) && !(SSFN_TYPE_STYLE(ctx->f->type) & SSFN_STYLE_ITALIC);
|
ci = (ctx->style & SSFN_STYLE_ITALIC) && !(SSFN_TYPE_STYLE(ctx->f->type) & SSFN_STYLE_ITALIC);
|
||||||
cb = (ctx->style & SSFN_STYLE_BOLD) && !(SSFN_TYPE_STYLE(ctx->f->type) & SSFN_STYLE_BOLD) ? (ctx->f->height+64)>>6 : 0;
|
cb = (ctx->style & SSFN_STYLE_BOLD) && !(SSFN_TYPE_STYLE(ctx->f->type) & SSFN_STYLE_BOLD) ? (ctx->f->height+64)>>6 : 0;
|
||||||
w = ctx->rc->w * h / ctx->f->height;
|
w = (ctx->rc->w * h + ctx->f->height - 1) / ctx->f->height;
|
||||||
p = w + (ci ? h / SSFN_ITALIC_DIV : 0) + cb;
|
p = w + (ci ? h / SSFN_ITALIC_DIV : 0) + cb;
|
||||||
/* failsafe, should never happen */
|
/* failsafe, should never happen */
|
||||||
if(p * h >= SSFN_DATA_MAX) return SSFN_ERR_BADSIZE;
|
if(p * h >= SSFN_DATA_MAX) return SSFN_ERR_BADSIZE;
|
||||||
|
@ -1249,19 +1249,19 @@ again: if(p >= SSFN_FAMILY_BYNAME) { n = 0; m = 4; } else n = m = p;
|
||||||
ctx->size : ctx->size * ctx->f->height / ctx->f->baseline;
|
ctx->size : ctx->size * ctx->f->height / ctx->f->baseline;
|
||||||
if(h > ctx->line) ctx->line = h;
|
if(h > ctx->line) ctx->line = h;
|
||||||
w = ctx->g->p * h / ctx->g->h;
|
w = ctx->g->p * h / ctx->g->h;
|
||||||
s = ctx->g->x * h / ctx->f->height - ctx->g->o * h / ctx->f->height;
|
s = ((ctx->g->x - ctx->g->o) * h + ctx->f->height - 1) / ctx->f->height;
|
||||||
n = ctx->size > 16 ? 2 : 1;
|
n = ctx->size > 16 ? 2 : 1;
|
||||||
if(w < n) w = n;
|
if(w < n) w = n;
|
||||||
if(s < n) s = n;
|
if(s < n) s = n;
|
||||||
|
if(ctx->g->x) {
|
||||||
|
ctx->ox = ox = ((ctx->g->o * h + ctx->f->height - 1) / ctx->f->height) + (ctx->style & SSFN_STYLE_RTL ? w : 0);
|
||||||
|
ctx->oy = oy = (ctx->g->a * h + ctx->f->height - 1) / ctx->f->height;
|
||||||
|
} else { ctx->ox = ox = w / 2; ctx->oy = oy = 0; }
|
||||||
if(dst->ptr) {
|
if(dst->ptr) {
|
||||||
if(ctx->g->x) {
|
|
||||||
ox = (ctx->g->o * h / ctx->f->height) + (ctx->style & SSFN_STYLE_RTL ? w : 0);
|
|
||||||
oy = ctx->g->a * h / ctx->f->height;
|
|
||||||
} else { ox = w / 2; oy = 0; }
|
|
||||||
j = dst->w < 0 ? -dst->w : dst->w;
|
j = dst->w < 0 ? -dst->w : dst->w;
|
||||||
cs = dst->w < 0 ? 16 : 0;
|
cs = dst->w < 0 ? 16 : 0;
|
||||||
cb = (h + 64) >> 6; uix = w > s ? w : s; uax = 0;
|
cb = (h + 64) >> 6; uix = w > s ? w : s; uax = 0;
|
||||||
n = ctx->f->underline * h / ctx->f->height;
|
n = (ctx->f->underline * h + ctx->f->height - 1) / ctx->f->height;
|
||||||
#ifdef SSFN_DEBUGGLYPH
|
#ifdef SSFN_DEBUGGLYPH
|
||||||
printf("Scaling to w %d h %d (glyph %d %d, cache %d %d, font %d)\n",
|
printf("Scaling to w %d h %d (glyph %d %d, cache %d %d, font %d)\n",
|
||||||
w,h,ctx->rc->w,ctx->rc->h,ctx->g->p,ctx->g->h,ctx->f->height);
|
w,h,ctx->rc->w,ctx->rc->h,ctx->g->p,ctx->g->h,ctx->f->height);
|
||||||
|
@ -1285,43 +1285,39 @@ again: if(p >= SSFN_FAMILY_BYNAME) { n = 0; m = 4; } else n = m = p;
|
||||||
x0 = (x << 8) * ctx->g->p / w; X0 = x0 >> 8; x1 = ((x + 1) << 8) * ctx->g->p / w; X1 = x1 >> 8;
|
x0 = (x << 8) * ctx->g->p / w; X0 = x0 >> 8; x1 = ((x + 1) << 8) * ctx->g->p / w; X1 = x1 >> 8;
|
||||||
for(ys = y0; ys < y1; ys += 256) {
|
for(ys = y0; ys < y1; ys += 256) {
|
||||||
if(ys >> 8 == Y0) { yp = 256 - (ys & 0xFF); ys &= ~0xFF; if(yp > y1 - y0) yp = y1 - y0; }
|
if(ys >> 8 == Y0) { yp = 256 - (ys & 0xFF); ys &= ~0xFF; if(yp > y1 - y0) yp = y1 - y0; }
|
||||||
else if(ys >> 8 == Y1) yp = y1 & 0xFF;
|
else if(ys >> 8 == Y1) yp = y1 & 0xFF; else yp = 256;
|
||||||
else yp = 256;
|
|
||||||
X2 = (ys >> 8) * ctx->g->p;
|
X2 = (ys >> 8) * ctx->g->p;
|
||||||
for(xs = x0; xs < x1; xs += 256) {
|
for(xs = x0; xs < x1; xs += 256) {
|
||||||
if (xs >> 8 == X0) {
|
if (xs >> 8 == X0) {
|
||||||
k = 256 - (xs & 0xFF); xs &= ~0xFF; if(k > x1 - x0) k = x1 - x0;
|
k = 256 - (xs & 0xFF); xs &= ~0xFF; if(k > x1 - x0) k = x1 - x0; pc = k == 256 ? yp : (k * yp)>>8;
|
||||||
pc = k == 256 ? yp : (k * yp) >> 8;
|
|
||||||
} else
|
} else
|
||||||
if (xs >> 8 == X1) { k = x1 & 0xFF; pc = k == 256 ? yp : (k * yp) >> 8; }
|
if (xs >> 8 == X1) { k = x1 & 0xFF; pc = k == 256 ? yp : (k * yp) >> 8; }
|
||||||
else pc = yp;
|
else pc = yp;
|
||||||
m += pc;
|
m += pc;
|
||||||
k = ctx->g->data[X2 + (xs >> 8)];
|
k = ctx->g->data[X2 + (xs >> 8)];
|
||||||
if(k == 0xFF) {
|
if(k == 0xFF) {
|
||||||
sB += bB * pc; sG += bG * pc; sR += bR * pc;
|
sB += bB * pc; sG += bG * pc; sR += bR * pc; sA += 255;
|
||||||
} else
|
|
||||||
if(k == 0xFE || !ctx->f->cmap_offs) {
|
|
||||||
af = (256 - fA) * pc;
|
|
||||||
sB += fB * af; sG += fG * af; sR += fR * af; sA += fA * pc;
|
|
||||||
} else {
|
} else {
|
||||||
P = *((uint32_t*)((uint8_t*)ctx->f + ctx->f->cmap_offs + (k << 2)));
|
if(k == 0xFE || !ctx->f->cmap_offs) {
|
||||||
af = (256 - (P >> 24)) * pc;
|
dB = fB; dG = fG; dR = fR; dA = fA;
|
||||||
sR += (((P >> 16) & 0xFF) * af);
|
} else {
|
||||||
sG += (((P >> 8) & 0xFF) * af);
|
P = *((uint32_t*)((uint8_t*)ctx->f + ctx->f->cmap_offs + (k << 2)));
|
||||||
sB += (((P >> 0) & 0xFF) * af);
|
dR = (P >> 16) & 0xFF; dG = (P >> 8) & 0xFF; dB = (P >> 0) & 0xFF; dA = (P >> 24) & 0xFF;
|
||||||
sA += (((P >> 24) & 0xFF) * pc);
|
}
|
||||||
|
if(dA == 255) {
|
||||||
|
sB += dB * pc; sG += dG * pc; sR += dR * pc; sA += dA * pc;
|
||||||
|
} else {
|
||||||
|
sB += (dB * dA + bB * (255 - dA)) * pc / 255; sG += (dG * dA + bG * (255 - dA)) * pc / 255;
|
||||||
|
sR += (dR * dA + bR * (255 - dA)) * pc / 255; sA += dA * pc;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(m) { sR /= m; sG /= m; sB /= m; sA /= m; }
|
if(m) { sR /= m; sG /= m; sB /= m; sA /= m; } else { sR >>= 8; sG >>= 8; sB >>= 8; sA >>= 8; }
|
||||||
else { sR >>= 8; sG >>= 8; sB >>= 8; sA >>= 8; }
|
|
||||||
if(sA > 15) {
|
if(sA > 15) {
|
||||||
*Ol = ((sA > 255 ? 255 : sA) << 24) | ((sR > 255 ? 255 : sR) << (16 - cs)) |
|
*Ol = ((sA > 255 ? 255 : sA) << 24) | ((sR > 255 ? 255 : sR) << (16 - cs)) |
|
||||||
((sG > 255 ? 255 : sG) << 8) | ((sB > 255 ? 255 : sB) << cs);
|
((sG > 255 ? 255 : sG) << 8) | ((sB > 255 ? 255 : sB) << cs);
|
||||||
if(y == n) {
|
if(y == n) { if(uix > x) { uix = x; } if(uax < x) { uax = x; } }
|
||||||
if(uix > x) uix = x;
|
|
||||||
if(uax < x) uax = x;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1373,8 +1369,9 @@ again: if(p >= SSFN_FAMILY_BYNAME) { n = 0; m = 4; } else n = m = p;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
/* add advance and kerning */
|
/* add advance and kerning */
|
||||||
dst->x += (ctx->style & SSFN_STYLE_RTL ? -s : s);
|
ctx->ax = (ctx->style & SSFN_STYLE_RTL ? -s : s);
|
||||||
dst->y += ctx->g->y * h / ctx->f->height;
|
dst->x += ctx->ax;
|
||||||
|
dst->y += (ctx->g->y * h + ctx->f->height - 1) / ctx->f->height;
|
||||||
ptr = (uint8_t*)str + ret;
|
ptr = (uint8_t*)str + ret;
|
||||||
if(!(ctx->style & SSFN_STYLE_NOKERN) && ctx->f->kerning_offs && _ssfn_c(ctx->f, (const char*)ptr, &i, &P) && P > 32) {
|
if(!(ctx->style & SSFN_STYLE_NOKERN) && ctx->f->kerning_offs && _ssfn_c(ctx->f, (const char*)ptr, &i, &P) && P > 32) {
|
||||||
ptr = (uint8_t*)ctx->rc + sizeof(ssfn_chr_t);
|
ptr = (uint8_t*)ctx->rc + sizeof(ssfn_chr_t);
|
||||||
|
@ -1438,33 +1435,35 @@ again: if(p >= SSFN_FAMILY_BYNAME) { n = 0; m = 4; } else n = m = p;
|
||||||
int ssfn_bbox(ssfn_t *ctx, const char *str, int *w, int *h, int *left, int *top)
|
int ssfn_bbox(ssfn_t *ctx, const char *str, int *w, int *h, int *left, int *top)
|
||||||
{
|
{
|
||||||
ssfn_buf_t buf;
|
ssfn_buf_t buf;
|
||||||
int ret, f = 1, s;
|
int ret, f = 1, l = 0, t = 0;
|
||||||
|
|
||||||
if(!ctx || !str || !w || !h || !top || !left) return SSFN_ERR_INVINP;
|
if(!ctx || !str || !w || !h || !top || !left) return SSFN_ERR_INVINP;
|
||||||
*w = *h = *top = *left = 0;
|
*w = *h = *top = *left = 0;
|
||||||
if(!*str) return SSFN_OK;
|
if(!*str) return SSFN_OK;
|
||||||
SSFN_memset(&buf, 0, sizeof(ssfn_buf_t));
|
SSFN_memset(&buf, 0, sizeof(ssfn_buf_t)); ctx->line = 0;
|
||||||
while((ret = ssfn_render(ctx, &buf, str))) {
|
while((ret = ssfn_render(ctx, &buf, str))) {
|
||||||
if(ret < 0 || !ctx->g) return ret;
|
if(ret < 0 || !ctx->g) return ret;
|
||||||
if(f) { f = 0; buf.w = buf.x = ctx->style & SSFN_STYLE_RTL ? ctx->g->p : ctx->g->o; }
|
if(f) { f = 0; l = ctx->ox; buf.x += l; }
|
||||||
if(ctx->g->x) {
|
if(ctx->g->x) {
|
||||||
if(ctx->g->a > buf.y) buf.y = ctx->g->a;
|
if(ctx->oy > t) t = ctx->oy;
|
||||||
if(ctx->g->h > buf.h) buf.h = ctx->g->h;
|
|
||||||
buf.w += ctx->g->x;
|
|
||||||
} else {
|
} else {
|
||||||
if(buf.w < ctx->g->p) buf.w = ctx->g->p;
|
if(buf.w < ctx->g->p) buf.w = ctx->g->p;
|
||||||
buf.h += ctx->g->y ? ctx->g->y : ctx->g->h;
|
buf.h += ctx->g->y ? ctx->g->y : ctx->g->h;
|
||||||
}
|
}
|
||||||
str += ret;
|
str += ret;
|
||||||
}
|
}
|
||||||
if(ctx->g->x) buf.w += ctx->style & SSFN_STYLE_RTL ? ctx->g->o : ctx->g->p;
|
if((ctx->style & SSFN_STYLE_ITALIC) && !(SSFN_TYPE_STYLE(ctx->f->type) & SSFN_STYLE_ITALIC))
|
||||||
else { buf.x = buf.w / 2; buf.y = 0; }
|
buf.x += ctx->size / SSFN_ITALIC_DIV - l;
|
||||||
s = (ctx->style & SSFN_STYLE_ABS_SIZE) || SSFN_TYPE_FAMILY(ctx->f->type) == SSFN_FAMILY_MONOSPACE || !ctx->f->baseline ?
|
if(ctx->g->x) {
|
||||||
ctx->size : ctx->size * ctx->f->height / ctx->f->baseline;
|
*w = buf.x;
|
||||||
*w = buf.w * s / ctx->f->height;
|
*h = ctx->line;
|
||||||
*h = buf.h * s / ctx->f->height;
|
*left = l;
|
||||||
*left = ctx->style & SSFN_STYLE_RTL ? *w : buf.x * s / ctx->f->height;
|
*top = t;
|
||||||
*top = buf.y * s / ctx->f->height;
|
} else {
|
||||||
|
*w = buf.w;
|
||||||
|
*h = buf.y;
|
||||||
|
*top = *left = 0;
|
||||||
|
}
|
||||||
return SSFN_OK;
|
return SSFN_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1536,6 +1535,9 @@ int ssfn_putc(uint32_t unicode)
|
||||||
|
|
||||||
if(!ssfn_src || ssfn_src->magic[0] != 'S' || ssfn_src->magic[1] != 'F' || ssfn_src->magic[2] != 'N' ||
|
if(!ssfn_src || ssfn_src->magic[0] != 'S' || ssfn_src->magic[1] != 'F' || ssfn_src->magic[2] != 'N' ||
|
||||||
ssfn_src->magic[3] != '2' || !ssfn_dst.ptr || !ssfn_dst.p) return SSFN_ERR_INVINP;
|
ssfn_src->magic[3] != '2' || !ssfn_dst.ptr || !ssfn_dst.p) return SSFN_ERR_INVINP;
|
||||||
|
if(unicode == '\r' || unicode == '\n') {
|
||||||
|
ssfn_dst.x = 0; if(unicode == '\n') { ssfn_dst.y += ssfn_src->height; } return SSFN_OK;
|
||||||
|
}
|
||||||
w = ssfn_dst.w < 0 ? -ssfn_dst.w : ssfn_dst.w;
|
w = ssfn_dst.w < 0 ? -ssfn_dst.w : ssfn_dst.w;
|
||||||
for(ptr = (uint8_t*)ssfn_src + ssfn_src->characters_offs, i = 0; i < 0x110000; i++) {
|
for(ptr = (uint8_t*)ssfn_src + ssfn_src->characters_offs, i = 0; i < 0x110000; i++) {
|
||||||
if(ptr[0] == 0xFF) { i += 65535; ptr++; }
|
if(ptr[0] == 0xFF) { i += 65535; ptr++; }
|
||||||
|
@ -1637,5 +1639,5 @@ namespace SSFN {
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
/**/
|
||||||
#endif /* _SSFN_H_ */
|
#endif /* _SSFN_H_ */
|
||||||
|
|
|
@ -27,8 +27,6 @@ int main(int argc, char **argv)
|
||||||
efi_status_t status;
|
efi_status_t status;
|
||||||
efi_guid_t gopGuid = EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID;
|
efi_guid_t gopGuid = EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID;
|
||||||
efi_gop_t *gop = NULL;
|
efi_gop_t *gop = NULL;
|
||||||
efi_gop_mode_info_t *info = NULL;
|
|
||||||
uintn_t isiz = sizeof(efi_gop_mode_info_t);
|
|
||||||
FILE *f;
|
FILE *f;
|
||||||
ssfn_font_t *font;
|
ssfn_font_t *font;
|
||||||
long int size;
|
long int size;
|
||||||
|
|
|
@ -12,8 +12,6 @@ int main(int argc, char **argv)
|
||||||
efi_status_t status;
|
efi_status_t status;
|
||||||
efi_guid_t gopGuid = EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID;
|
efi_guid_t gopGuid = EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID;
|
||||||
efi_gop_t *gop = NULL;
|
efi_gop_t *gop = NULL;
|
||||||
efi_gop_mode_info_t *info = NULL;
|
|
||||||
uintn_t isiz = sizeof(efi_gop_mode_info_t), currentMode, i;
|
|
||||||
FILE *f;
|
FILE *f;
|
||||||
unsigned char *buff;
|
unsigned char *buff;
|
||||||
uint32_t *data;
|
uint32_t *data;
|
||||||
|
|
|
@ -67,14 +67,14 @@ unsigned char *stbi_write_png_to_mem(const unsigned char *pixels, int stride_byt
|
||||||
#ifdef STB_IMAGE_IMPLEMENTATION
|
#ifdef STB_IMAGE_IMPLEMENTATION
|
||||||
const char *stbi__g_failure_reason;
|
const char *stbi__g_failure_reason;
|
||||||
|
|
||||||
_inline static unsigned char stbi__get8(stbi__context *s)
|
__inline__ static unsigned char stbi__get8(stbi__context *s)
|
||||||
{
|
{
|
||||||
if (s->img_buffer < s->img_buffer_end)
|
if (s->img_buffer < s->img_buffer_end)
|
||||||
return *s->img_buffer++;
|
return *s->img_buffer++;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
_inline static int stbi__at_eof(stbi__context *s)
|
__inline__ static int stbi__at_eof(stbi__context *s)
|
||||||
{
|
{
|
||||||
return s->img_buffer >= s->img_buffer_end;
|
return s->img_buffer >= s->img_buffer_end;
|
||||||
}
|
}
|
||||||
|
@ -117,7 +117,7 @@ static int stbi__errstr(const char *str)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
_inline static void *stbi__malloc(size_t size)
|
__inline__ static void *stbi__malloc(size_t size)
|
||||||
{
|
{
|
||||||
return STBI_MALLOC(size);
|
return STBI_MALLOC(size);
|
||||||
}
|
}
|
||||||
|
@ -267,7 +267,7 @@ typedef struct
|
||||||
stbi__uint16 value[288];
|
stbi__uint16 value[288];
|
||||||
} stbi__zhuffman;
|
} stbi__zhuffman;
|
||||||
|
|
||||||
_inline static int stbi__bitreverse16(int n)
|
__inline__ static int stbi__bitreverse16(int n)
|
||||||
{
|
{
|
||||||
n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1);
|
n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1);
|
||||||
n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2);
|
n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2);
|
||||||
|
@ -276,7 +276,7 @@ _inline static int stbi__bitreverse16(int n)
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
_inline static int stbi__bit_reverse(int v, int bits)
|
__inline__ static int stbi__bit_reverse(int v, int bits)
|
||||||
{
|
{
|
||||||
STBI_ASSERT(bits <= 16);
|
STBI_ASSERT(bits <= 16);
|
||||||
return stbi__bitreverse16(v) >> (16-bits);
|
return stbi__bitreverse16(v) >> (16-bits);
|
||||||
|
@ -342,7 +342,7 @@ typedef struct
|
||||||
stbi__zhuffman z_length, z_distance;
|
stbi__zhuffman z_length, z_distance;
|
||||||
} stbi__zbuf;
|
} stbi__zbuf;
|
||||||
|
|
||||||
_inline static unsigned char stbi__zget8(stbi__zbuf *z)
|
__inline__ static unsigned char stbi__zget8(stbi__zbuf *z)
|
||||||
{
|
{
|
||||||
if (z->zbuffer >= z->zbuffer_end) return 0;
|
if (z->zbuffer >= z->zbuffer_end) return 0;
|
||||||
return *z->zbuffer++;
|
return *z->zbuffer++;
|
||||||
|
@ -357,7 +357,7 @@ static void stbi__fill_bits(stbi__zbuf *z)
|
||||||
} while (z->num_bits <= 24);
|
} while (z->num_bits <= 24);
|
||||||
}
|
}
|
||||||
|
|
||||||
_inline static unsigned int stbi__zreceive(stbi__zbuf *z, int n)
|
__inline__ static unsigned int stbi__zreceive(stbi__zbuf *z, int n)
|
||||||
{
|
{
|
||||||
unsigned int k;
|
unsigned int k;
|
||||||
if (z->num_bits < n) stbi__fill_bits(z);
|
if (z->num_bits < n) stbi__fill_bits(z);
|
||||||
|
@ -382,7 +382,7 @@ static int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z)
|
||||||
return z->value[b];
|
return z->value[b];
|
||||||
}
|
}
|
||||||
|
|
||||||
_inline static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z)
|
__inline__ static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z)
|
||||||
{
|
{
|
||||||
int b,s;
|
int b,s;
|
||||||
if (a->num_bits < 16) stbi__fill_bits(a);
|
if (a->num_bits < 16) stbi__fill_bits(a);
|
||||||
|
@ -520,7 +520,7 @@ static int stbi__compute_huffman_codes(stbi__zbuf *a)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
_inline static int stbi__parse_uncompressed_block(stbi__zbuf *a)
|
__inline__ static int stbi__parse_uncompressed_block(stbi__zbuf *a)
|
||||||
{
|
{
|
||||||
unsigned char header[4];
|
unsigned char header[4];
|
||||||
int len,nlen,k;
|
int len,nlen,k;
|
||||||
|
@ -638,7 +638,7 @@ static stbi__pngchunk stbi__get_chunk_header(stbi__context *s)
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
_inline static int stbi__check_png_header(stbi__context *s)
|
__inline__ static int stbi__check_png_header(stbi__context *s)
|
||||||
{
|
{
|
||||||
static unsigned char png_sig[8] = { 137,80,78,71,13,10,26,10 };
|
static unsigned char png_sig[8] = { 137,80,78,71,13,10,26,10 };
|
||||||
int i;
|
int i;
|
||||||
|
|
|
@ -9,7 +9,7 @@ int main(int argc, char **argv)
|
||||||
(void)argv;
|
(void)argv;
|
||||||
efi_status_t status;
|
efi_status_t status;
|
||||||
efi_memory_descriptor_t *memory_map = NULL, *mement;
|
efi_memory_descriptor_t *memory_map = NULL, *mement;
|
||||||
uintn_t memory_map_size=0, map_key=0, desc_size=0, i;
|
uintn_t memory_map_size=0, map_key=0, desc_size=0;
|
||||||
const char *types[] = {
|
const char *types[] = {
|
||||||
"EfiReservedMemoryType",
|
"EfiReservedMemoryType",
|
||||||
"EfiLoaderCode",
|
"EfiLoaderCode",
|
||||||
|
|
|
@ -59,7 +59,7 @@ int main(int argc, char **argv)
|
||||||
Elf64_Ehdr *elf;
|
Elf64_Ehdr *elf;
|
||||||
Elf64_Phdr *phdr;
|
Elf64_Phdr *phdr;
|
||||||
uintptr_t entry;
|
uintptr_t entry;
|
||||||
int i, j;
|
int i;
|
||||||
|
|
||||||
/* load the file */
|
/* load the file */
|
||||||
if((f = fopen("\\0E_elfload\\kernel.elf", "r"))) {
|
if((f = fopen("\\0E_elfload\\kernel.elf", "r"))) {
|
||||||
|
|
|
@ -2,7 +2,7 @@ TARGET = exit_bs.efi
|
||||||
SRCS = exit_bs.c
|
SRCS = exit_bs.c
|
||||||
EXTRA = kernel.elf
|
EXTRA = kernel.elf
|
||||||
|
|
||||||
USE_GCC=1
|
#USE_GCC=1
|
||||||
include uefi/Makefile
|
include uefi/Makefile
|
||||||
|
|
||||||
kernel.elf:
|
kernel.elf:
|
||||||
|
|
|
@ -1,47 +0,0 @@
|
||||||
/*** ELF64 defines and structs ***/
|
|
||||||
#define ELFMAG "\177ELF"
|
|
||||||
#define SELFMAG 4
|
|
||||||
#define EI_CLASS 4 /* File class byte index */
|
|
||||||
#define ELFCLASS64 2 /* 64-bit objects */
|
|
||||||
#define EI_DATA 5 /* Data encoding byte index */
|
|
||||||
#define ELFDATA2LSB 1 /* 2's complement, little endian */
|
|
||||||
#define ET_EXEC 2 /* Executable file */
|
|
||||||
#define PT_LOAD 1 /* Loadable program segment */
|
|
||||||
|
|
||||||
#ifdef __x86_64__
|
|
||||||
#define EM_MACH 62 /* AMD x86-64 architecture */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __aarch64__
|
|
||||||
#define EM_MACH 183 /* ARM aarch64 architecture */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
uint8_t e_ident[16]; /* Magic number and other info */
|
|
||||||
uint16_t e_type; /* Object file type */
|
|
||||||
uint16_t e_machine; /* Architecture */
|
|
||||||
uint32_t e_version; /* Object file version */
|
|
||||||
uint64_t e_entry; /* Entry point virtual address */
|
|
||||||
uint64_t e_phoff; /* Program header table file offset */
|
|
||||||
uint64_t e_shoff; /* Section header table file offset */
|
|
||||||
uint32_t e_flags; /* Processor-specific flags */
|
|
||||||
uint16_t e_ehsize; /* ELF header size in bytes */
|
|
||||||
uint16_t e_phentsize; /* Program header table entry size */
|
|
||||||
uint16_t e_phnum; /* Program header table entry count */
|
|
||||||
uint16_t e_shentsize; /* Section header table entry size */
|
|
||||||
uint16_t e_shnum; /* Section header table entry count */
|
|
||||||
uint16_t e_shstrndx; /* Section header string table index */
|
|
||||||
} Elf64_Ehdr;
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
uint32_t p_type; /* Segment type */
|
|
||||||
uint32_t p_flags; /* Segment flags */
|
|
||||||
uint64_t p_offset; /* Segment file offset */
|
|
||||||
uint64_t p_vaddr; /* Segment virtual address */
|
|
||||||
uint64_t p_paddr; /* Segment physical address */
|
|
||||||
uint64_t p_filesz; /* Segment size in file */
|
|
||||||
uint64_t p_memsz; /* Segment size in memory */
|
|
||||||
uint64_t p_align; /* Segment alignment */
|
|
||||||
} Elf64_Phdr;
|
|
|
@ -62,9 +62,7 @@ int main(int argc, char **argv)
|
||||||
efi_status_t status;
|
efi_status_t status;
|
||||||
efi_guid_t gopGuid = EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID;
|
efi_guid_t gopGuid = EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID;
|
||||||
efi_gop_t *gop = NULL;
|
efi_gop_t *gop = NULL;
|
||||||
efi_gop_mode_info_t *info = NULL;
|
int i;
|
||||||
uintn_t isiz = sizeof(efi_gop_mode_info_t);
|
|
||||||
int i, j;
|
|
||||||
|
|
||||||
/* load the file */
|
/* load the file */
|
||||||
if((f = fopen("\\0F_exit_bs\\kernel.elf", "r"))) {
|
if((f = fopen("\\0F_exit_bs\\kernel.elf", "r"))) {
|
||||||
|
|
11
uefi/stdio.c
11
uefi/stdio.c
|
@ -62,7 +62,6 @@ void __stdio_seterrno(efi_status_t status)
|
||||||
|
|
||||||
int fstat (FILE *__f, struct stat *__buf)
|
int fstat (FILE *__f, struct stat *__buf)
|
||||||
{
|
{
|
||||||
uint64_t off = 0;
|
|
||||||
efi_guid_t infGuid = EFI_FILE_INFO_GUID;
|
efi_guid_t infGuid = EFI_FILE_INFO_GUID;
|
||||||
efi_file_info_t info;
|
efi_file_info_t info;
|
||||||
uintn_t fsiz = (uintn_t)sizeof(efi_file_info_t);
|
uintn_t fsiz = (uintn_t)sizeof(efi_file_info_t);
|
||||||
|
@ -433,7 +432,6 @@ int feof (FILE *__stream)
|
||||||
efi_file_info_t info;
|
efi_file_info_t info;
|
||||||
uintn_t fsiz = (uintn_t)sizeof(efi_file_info_t), i;
|
uintn_t fsiz = (uintn_t)sizeof(efi_file_info_t), i;
|
||||||
efi_status_t status;
|
efi_status_t status;
|
||||||
int ret;
|
|
||||||
if(__stream == stdin || __stream == stdout || __stream == stderr) {
|
if(__stream == stdin || __stream == stdout || __stream == stderr) {
|
||||||
errno = ESPIPE;
|
errno = ESPIPE;
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -467,8 +465,9 @@ int vsnprintf(char_t *dst, size_t maxlen, const char_t *fmt, __builtin_va_list a
|
||||||
int64_t arg;
|
int64_t arg;
|
||||||
int len, sign, i, j;
|
int len, sign, i, j;
|
||||||
char_t *p, *orig=dst, *end = dst + maxlen - 1, tmpstr[19], pad, n;
|
char_t *p, *orig=dst, *end = dst + maxlen - 1, tmpstr[19], pad, n;
|
||||||
|
#if !defined(USE_UTF8) || !USE_UTF8
|
||||||
char *c;
|
char *c;
|
||||||
|
#endif
|
||||||
if(dst==NULL || fmt==NULL)
|
if(dst==NULL || fmt==NULL)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
@ -558,7 +557,7 @@ copystring: if(p==NULL) {
|
||||||
switch(*p) {
|
switch(*p) {
|
||||||
case CL('\a'): *dst++ = CL('a'); break;
|
case CL('\a'): *dst++ = CL('a'); break;
|
||||||
case CL('\b'): *dst++ = CL('b'); break;
|
case CL('\b'): *dst++ = CL('b'); break;
|
||||||
case CL('\e'): *dst++ = CL('e'); break;
|
case 27: *dst++ = CL('e'); break; /* gcc 10.2 doesn't like CL('\e') in ansi mode */
|
||||||
case CL('\f'): *dst++ = CL('f'); break;
|
case CL('\f'): *dst++ = CL('f'); break;
|
||||||
case CL('\n'): *dst++ = CL('n'); break;
|
case CL('\n'): *dst++ = CL('n'); break;
|
||||||
case CL('\r'): *dst++ = CL('r'); break;
|
case CL('\r'): *dst++ = CL('r'); break;
|
||||||
|
@ -599,7 +598,7 @@ copystring: if(p==NULL) {
|
||||||
switch(arg) {
|
switch(arg) {
|
||||||
case L'\a': *dst++ = L'a'; break;
|
case L'\a': *dst++ = L'a'; break;
|
||||||
case L'\b': *dst++ = L'b'; break;
|
case L'\b': *dst++ = L'b'; break;
|
||||||
case L'\e': *dst++ = L'e'; break;
|
case 27: *dst++ = L'e'; break; /* gcc 10.2 doesn't like L'\e' in ansi mode */
|
||||||
case L'\f': *dst++ = L'f'; break;
|
case L'\f': *dst++ = L'f'; break;
|
||||||
case L'\n': *dst++ = L'n'; break;
|
case L'\n': *dst++ = L'n'; break;
|
||||||
case L'\r': *dst++ = L'r'; break;
|
case L'\r': *dst++ = L'r'; break;
|
||||||
|
@ -695,7 +694,7 @@ int vfprintf (FILE *__stream, const char_t *__format, __builtin_va_list args)
|
||||||
{
|
{
|
||||||
wchar_t dst[BUFSIZ];
|
wchar_t dst[BUFSIZ];
|
||||||
char_t tmp[BUFSIZ];
|
char_t tmp[BUFSIZ];
|
||||||
uintn_t ret, bs, i;
|
uintn_t ret, i;
|
||||||
#if USE_UTF8
|
#if USE_UTF8
|
||||||
ret = vsnprintf(tmp, BUFSIZ, __format, args);
|
ret = vsnprintf(tmp, BUFSIZ, __format, args);
|
||||||
ret = mbstowcs(dst, tmp, BUFSIZ - 1);
|
ret = mbstowcs(dst, tmp, BUFSIZ - 1);
|
||||||
|
|
|
@ -118,7 +118,7 @@ void *realloc (void *__ptr, size_t __size)
|
||||||
if(EFI_ERROR(status) || !ret) { errno = ENOMEM; ret = NULL; }
|
if(EFI_ERROR(status) || !ret) { errno = ENOMEM; ret = NULL; }
|
||||||
if(ret) {
|
if(ret) {
|
||||||
memcpy(ret, (void*)__stdlib_allocs[i], __stdlib_allocs[i + 1] < __size ? __stdlib_allocs[i + 1] : __size);
|
memcpy(ret, (void*)__stdlib_allocs[i], __stdlib_allocs[i + 1] < __size ? __stdlib_allocs[i + 1] : __size);
|
||||||
if(__size > __stdlib_allocs[i + 1]) memset(ret + __stdlib_allocs[i + 1], 0, __size - __stdlib_allocs[i + 1]);
|
if(__size > __stdlib_allocs[i + 1]) memset((uint8_t*)ret + __stdlib_allocs[i + 1], 0, __size - __stdlib_allocs[i + 1]);
|
||||||
}
|
}
|
||||||
BS->FreePool((void*)__stdlib_allocs[i]);
|
BS->FreePool((void*)__stdlib_allocs[i]);
|
||||||
__stdlib_allocs[i] = (uintptr_t)ret;
|
__stdlib_allocs[i] = (uintptr_t)ret;
|
||||||
|
@ -162,7 +162,7 @@ int exit_bs()
|
||||||
{
|
{
|
||||||
efi_status_t status;
|
efi_status_t status;
|
||||||
efi_memory_descriptor_t *memory_map = NULL;
|
efi_memory_descriptor_t *memory_map = NULL;
|
||||||
uintn_t cnt = 3, memory_map_size=0, map_key=0, desc_size=0, i;
|
uintn_t cnt = 3, memory_map_size=0, map_key=0, desc_size=0;
|
||||||
if(__stdlib_allocs)
|
if(__stdlib_allocs)
|
||||||
BS->FreePool(__stdlib_allocs);
|
BS->FreePool(__stdlib_allocs);
|
||||||
__stdlib_numallocs = 0;
|
__stdlib_numallocs = 0;
|
||||||
|
@ -211,7 +211,6 @@ int mblen(const char *s, size_t n)
|
||||||
int mbtowc (wchar_t * __pwc, const char *s, size_t n)
|
int mbtowc (wchar_t * __pwc, const char *s, size_t n)
|
||||||
{
|
{
|
||||||
wchar_t arg;
|
wchar_t arg;
|
||||||
const char *orig = s;
|
|
||||||
int ret = 1;
|
int ret = 1;
|
||||||
if(!s || !*s) return 0;
|
if(!s || !*s) return 0;
|
||||||
arg = (wchar_t)*s;
|
arg = (wchar_t)*s;
|
||||||
|
|
|
@ -214,7 +214,7 @@ char_t *_strtok_r(char_t *s, const char_t *d, char_t **p)
|
||||||
char_t *tok, *sp;
|
char_t *tok, *sp;
|
||||||
|
|
||||||
if(d == NULL || (s == NULL && (s=*p) == NULL)) return NULL;
|
if(d == NULL || (s == NULL && (s=*p) == NULL)) return NULL;
|
||||||
again:
|
|
||||||
c = *s++;
|
c = *s++;
|
||||||
for(sp = (char_t *)d; (sc=*sp++)!=0;) {
|
for(sp = (char_t *)d; (sc=*sp++)!=0;) {
|
||||||
if(c == sc) { *p=s; *(s-1)=0; return s-1; }
|
if(c == sc) { *p=s; *(s-1)=0; return s-1; }
|
||||||
|
|
Loading…
Reference in a new issue