mirror of
https://git.planet-casio.com/Lephenixnoir/gint.git
synced 2025-01-01 06:23:35 +01:00
topti: implement background color and text size
Also transition the bootlog from fxlib to topti.
This commit is contained in:
parent
3f7c0a04ad
commit
417340ce91
7 changed files with 111 additions and 41 deletions
|
@ -16,6 +16,8 @@
|
||||||
#define DWIDTH 396
|
#define DWIDTH 396
|
||||||
#define DHEIGHT 224
|
#define DHEIGHT 224
|
||||||
|
|
||||||
|
typedef void font_t;
|
||||||
|
|
||||||
#endif /* FXCG50 */
|
#endif /* FXCG50 */
|
||||||
|
|
||||||
#endif /* GINT_DISPLAY_CG */
|
#endif /* GINT_DISPLAY_CG */
|
||||||
|
|
|
@ -184,6 +184,24 @@ typedef struct
|
||||||
@font Font to use for subsequent text rendering calls */
|
@font Font to use for subsequent text rendering calls */
|
||||||
void dfont(font_t const * font);
|
void dfont(font_t const * font);
|
||||||
|
|
||||||
|
/* dsize() - get the width and height of rendered text
|
||||||
|
This function computes the size that the given string would take up if
|
||||||
|
rendered with a certain font. If you specify a NULL font, the currently
|
||||||
|
configured font will be used; this differs from dfont() which uses gint's
|
||||||
|
default font when NULL is passed.
|
||||||
|
|
||||||
|
Note that the height of each glyph is not stored in the font, only the
|
||||||
|
maximum. Usually this is what you want because vertically-centered strings
|
||||||
|
must have the same baseline regardless of their contents. So the height
|
||||||
|
returned by dsize() is the same for all strings, only depends on the font.
|
||||||
|
|
||||||
|
The height is computed in constant time, and the width in linear time.
|
||||||
|
|
||||||
|
@str String whose size must be evaluated
|
||||||
|
@font Font to use; if NULL, defaults to the current font
|
||||||
|
@w @h Set to the width and height of the rendered text, may be NULL */
|
||||||
|
void dsize(const char *str, font_t const * font, int *w, int *h);
|
||||||
|
|
||||||
/* dtext() - display a string of text
|
/* dtext() - display a string of text
|
||||||
|
|
||||||
Draws some text in the video RAM using the font set with dfont() (or gint's
|
Draws some text in the video RAM using the font set with dfont() (or gint's
|
||||||
|
@ -196,8 +214,9 @@ void dfont(font_t const * font);
|
||||||
|
|
||||||
@x @y Coordinates of top-left corner of the rendered string
|
@x @y Coordinates of top-left corner of the rendered string
|
||||||
@str String to display
|
@str String to display
|
||||||
@color Which color to use */
|
@fg Text color
|
||||||
void dtext(int x, int y, const char *str, color_t color);
|
@bg Background color, pass [color_none] to disable */
|
||||||
|
void dtext(int x, int y, const char *str, color_t fg, color_t bg);
|
||||||
|
|
||||||
#endif /* FX9860G */
|
#endif /* FX9860G */
|
||||||
|
|
||||||
|
|
|
@ -77,7 +77,7 @@ conv = fxconv
|
||||||
#
|
#
|
||||||
|
|
||||||
# Version symbol is obtained by using the last commit hash on 7 nibbles
|
# Version symbol is obtained by using the last commit hash on 7 nibbles
|
||||||
version_hash = 0x0$(shell git show --format='%h' HEAD | tr -d "\n")
|
version_hash = 0x0$(shell git rev-parse --short HEAD)
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -114,7 +114,7 @@ version.o:
|
||||||
@ mkdir -p $(dir $@)
|
@ mkdir -p $(dir $@)
|
||||||
@ echo "_GINT_VERSION = $(version_hash);" > $@.txt
|
@ echo "_GINT_VERSION = $(version_hash);" > $@.txt
|
||||||
$(call cmd_b,ld,$@) $(ld) -r -R $@.txt -o $@
|
$(call cmd_b,ld,$@) $(ld) -r -R $@.txt -o $@
|
||||||
|
.PHONY: version.o
|
||||||
#
|
#
|
||||||
# Cleaning
|
# Cleaning
|
||||||
#
|
#
|
||||||
|
|
|
@ -9,6 +9,12 @@
|
||||||
#include <gint/mpu/intc.h>
|
#include <gint/mpu/intc.h>
|
||||||
#include <core/mmu.h>
|
#include <core/mmu.h>
|
||||||
#include <gint/gint.h>
|
#include <gint/gint.h>
|
||||||
|
#include <gint/display.h>
|
||||||
|
|
||||||
|
#ifdef FXCG50
|
||||||
|
#define dclear(c) Bdisp_AllClr_VRAM()
|
||||||
|
#define dupdate() Bdisp_PutDisp_DD()
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Linker script symbols - see core/start.c for details */
|
/* Linker script symbols - see core/start.c for details */
|
||||||
extern char
|
extern char
|
||||||
|
@ -20,24 +26,19 @@ extern char
|
||||||
void bootlog_loaded(void)
|
void bootlog_loaded(void)
|
||||||
{
|
{
|
||||||
/* Version string - the string constant resides in ROM */
|
/* Version string - the string constant resides in ROM */
|
||||||
uint32_t v = GINT_VERSION;
|
const char *base = "gint @";
|
||||||
const char *model = "gint #0.0-000";
|
const char *hexa = "0123456789abcdef";
|
||||||
char str[14];
|
char str[14];
|
||||||
|
|
||||||
for(int i = 0; i < 14; i++) str[i] = model[i];
|
for(int i = 0; i < 6; i++) str[i] = base[i];
|
||||||
|
str[13] = 0;
|
||||||
|
|
||||||
/* Quickly get the three digits of the build number */
|
/* Retrieve the commit number */
|
||||||
int x_q = (v & 0xffff) / 10;
|
for(int i = 0; i < 7; i++)
|
||||||
int x_r = (v & 0xffff) - 10 * x_q;
|
{
|
||||||
int y_q = x_q / 10;
|
int shift = 24 - (i << 2);
|
||||||
int y_r = x_q - 10 * y_q;
|
str[i + 6] = hexa[(GINT_VERSION >> shift) & 0xf];
|
||||||
|
}
|
||||||
str[5] = (v & 0xff000000) >> 24;
|
|
||||||
str[6] += (v & 0x00f00000) >> 20;
|
|
||||||
str[8] += (v & 0x000f0000) >> 16;
|
|
||||||
str[10] += y_q;
|
|
||||||
str[11] += y_r;
|
|
||||||
str[12] += x_r;
|
|
||||||
|
|
||||||
/* Size of memory sections */
|
/* Size of memory sections */
|
||||||
uint32_t rom_size = (uint32_t)&srom;
|
uint32_t rom_size = (uint32_t)&srom;
|
||||||
|
@ -49,7 +50,7 @@ void bootlog_loaded(void)
|
||||||
const char *names = "SH7337\0 SH7305\0 SH7355\0 SH7724";
|
const char *names = "SH7337\0 SH7305\0 SH7355\0 SH7724";
|
||||||
|
|
||||||
/* TODO: Use a solid API for boot-time printing */
|
/* TODO: Use a solid API for boot-time printing */
|
||||||
Bdisp_AllClr_VRAM();
|
dclear(color_white);
|
||||||
print(1, 1, str);
|
print(1, 1, str);
|
||||||
print(15, 1, " Loaded");
|
print(15, 1, " Loaded");
|
||||||
|
|
||||||
|
@ -64,7 +65,7 @@ void bootlog_loaded(void)
|
||||||
print_dec(17, 3, &mtors - &btors, 2);
|
print_dec(17, 3, &mtors - &btors, 2);
|
||||||
print_dec(20, 3, &etors - &mtors, 2);
|
print_dec(20, 3, &etors - &mtors, 2);
|
||||||
|
|
||||||
Bdisp_PutDisp_DD();
|
dupdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* bootlog_mapped() - ROM mapping stage */
|
/* bootlog_mapped() - ROM mapping stage */
|
||||||
|
@ -78,7 +79,7 @@ void bootlog_mapped(int rom, int ram)
|
||||||
(rom < 0) ? print(9, 4, "???") : print_dec(9, 4, rom, 3);
|
(rom < 0) ? print(9, 4, "???") : print_dec(9, 4, rom, 3);
|
||||||
(ram < 0) ? print(18, 4, "???") : print_dec(18, 4, ram, 3);
|
(ram < 0) ? print(18, 4, "???") : print_dec(18, 4, ram, 3);
|
||||||
|
|
||||||
Bdisp_PutDisp_DD();
|
dupdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* bootlog_kernel() - gint loading stage */
|
/* bootlog_kernel() - gint loading stage */
|
||||||
|
@ -113,5 +114,5 @@ void bootlog_kernel(void)
|
||||||
print_hex(18, 6, SH7305_INTC._->IPRL.word, 4);
|
print_hex(18, 6, SH7305_INTC._->IPRL.word, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
Bdisp_PutDisp_DD();
|
dupdate();
|
||||||
}
|
}
|
||||||
|
|
|
@ -142,9 +142,9 @@ int start(int isappli, int optnum)
|
||||||
if(rom < (uint32_t)&srom)
|
if(rom < (uint32_t)&srom)
|
||||||
{
|
{
|
||||||
Bdisp_AllClr_VRAM();
|
Bdisp_AllClr_VRAM();
|
||||||
print(1, 1, "Missing memory!");
|
PrintXY(0, 0, "Missing memory!", 0);
|
||||||
print_hex(1, 2, rom, 8);
|
print_hex(1, 2, rom, 8);
|
||||||
print(1, 3, "<");
|
PrintXY(0, 16, "<", 0);
|
||||||
print_hex(1, 4, (uint32_t)&srom, 8);
|
print_hex(1, 4, (uint32_t)&srom, 8);
|
||||||
Bdisp_PutDisp_DD();
|
Bdisp_PutDisp_DD();
|
||||||
while(1);
|
while(1);
|
||||||
|
|
|
@ -29,10 +29,10 @@ _topti_asm_white:
|
||||||
add #16, r4
|
add #16, r4
|
||||||
mov.l @r4, r1
|
mov.l @r4, r1
|
||||||
dt r7
|
dt r7
|
||||||
not r1, r1
|
not r0, r0
|
||||||
and r1, r0
|
and r0, r1
|
||||||
bf.s 1b
|
bf.s 1b
|
||||||
mov.l r0, @r4
|
mov.l r1, @r4
|
||||||
|
|
||||||
rts
|
rts
|
||||||
nop
|
nop
|
||||||
|
@ -79,6 +79,7 @@ _topti_asm_black:
|
||||||
1: mov.l @r6+, r0
|
1: mov.l @r6+, r0
|
||||||
dt r7
|
dt r7
|
||||||
mov.l @r4, r1
|
mov.l @r4, r1
|
||||||
|
/* (bubble) */
|
||||||
or r1, r0
|
or r1, r0
|
||||||
mov.l r0, @r4
|
mov.l r0, @r4
|
||||||
bf.s 1b
|
bf.s 1b
|
||||||
|
|
|
@ -172,9 +172,10 @@ int topti_split(uint32_t const * glyph, int width, int height, int free,
|
||||||
@x @y Target position on VRAM
|
@x @y Target position on VRAM
|
||||||
@str Text source
|
@str Text source
|
||||||
@f Font
|
@f Font
|
||||||
@asm_text Assembler function for the rendering proper */
|
@asm_fg Assembler function for text rendering
|
||||||
|
@asm_bg Assembler function for background rendering */
|
||||||
void topti_render(int x, int y, const char *str, font_t const *f,
|
void topti_render(int x, int y, const char *str, font_t const *f,
|
||||||
asm_text_t *asm_text)
|
asm_text_t *asm_fg, asm_text_t *asm_bg)
|
||||||
{
|
{
|
||||||
/* Storage height and number of free bits in operators[] */
|
/* Storage height and number of free bits in operators[] */
|
||||||
int height = f->data_height, free;
|
int height = f->data_height, free;
|
||||||
|
@ -191,9 +192,14 @@ void topti_render(int x, int y, const char *str, font_t const *f,
|
||||||
int vdisp = 0;
|
int vdisp = 0;
|
||||||
if(y < 0) vdisp = -y, y = 0;
|
if(y < 0) vdisp = -y, y = 0;
|
||||||
|
|
||||||
/* Operator data */
|
/* Operator data and background */
|
||||||
uint32_t operators[height];
|
uint32_t operators[height];
|
||||||
for(int i = 0; i < height; i++) operators[i] = 0;
|
uint32_t bg[height];
|
||||||
|
for(int i = 0; i < height; i++)
|
||||||
|
{
|
||||||
|
operators[i] = 0;
|
||||||
|
bg[i] = 0xffffffff >> (x & 31);
|
||||||
|
}
|
||||||
|
|
||||||
/* Put an initial offset to the operators to honor the x coordinate */
|
/* Put an initial offset to the operators to honor the x coordinate */
|
||||||
free = 32 - (x & 31);
|
free = 32 - (x & 31);
|
||||||
|
@ -223,11 +229,19 @@ void topti_render(int x, int y, const char *str, font_t const *f,
|
||||||
|
|
||||||
/* Once operators are full, update VRAM and start again */
|
/* Once operators are full, update VRAM and start again */
|
||||||
|
|
||||||
if(x >= 0) asm_text(v1, v2, operators + vdisp, height - vdisp);
|
if(x >= 0)
|
||||||
|
{
|
||||||
|
asm_bg(v1, v2, bg + vdisp, height - vdisp);
|
||||||
|
asm_fg(v1, v2, operators + vdisp, height - vdisp);
|
||||||
|
}
|
||||||
v1++, v2++;
|
v1++, v2++;
|
||||||
if(++x >= 4) break;
|
if(++x >= 4) break;
|
||||||
|
|
||||||
for(int i = 0; i < height; i++) operators[i] = 0;
|
for(int i = 0; i < height; i++)
|
||||||
|
{
|
||||||
|
operators[i] = 0;
|
||||||
|
bg[i] = 0xffffffff;
|
||||||
|
}
|
||||||
free += 32;
|
free += 32;
|
||||||
|
|
||||||
/* If information was lost in the split, finish it */
|
/* If information was lost in the split, finish it */
|
||||||
|
@ -241,12 +255,45 @@ void topti_render(int x, int y, const char *str, font_t const *f,
|
||||||
|
|
||||||
/* Put the final longwords */
|
/* Put the final longwords */
|
||||||
if(x >= 0 && x < 4 && free < 32)
|
if(x >= 0 && x < 4 && free < 32)
|
||||||
asm_text(v1, v2, operators + vdisp, height - vdisp);
|
{
|
||||||
|
for(int i = 0; i < height; i++) bg[i] &= ~((1 << free) - 1);
|
||||||
|
asm_bg(v1, v2, bg + vdisp, height - vdisp);
|
||||||
|
asm_fg(v1, v2, operators + vdisp, height - vdisp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* dsize() - get the width and height of rendered text */
|
||||||
|
void dsize(const char *str, font_t const * f, int *w, int *h)
|
||||||
|
{
|
||||||
|
if(!f) f = topti_font;
|
||||||
|
if(h) *h = f->line_height;
|
||||||
|
if(!w) return;
|
||||||
|
|
||||||
|
/* Width for monospaced fonts is easy, unfortunately we still need to
|
||||||
|
compute the length of [str]. Critical applications might do the
|
||||||
|
product themselves to avoid this cost. */
|
||||||
|
if(!f->prop)
|
||||||
|
{
|
||||||
|
int length = 0;
|
||||||
|
while(*str++) length++;
|
||||||
|
*w = (f->width + 1) * length - 1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* For proportional fonts, fetch the width of each individual glyphs */
|
||||||
|
int width = 0;
|
||||||
|
while(*str)
|
||||||
|
{
|
||||||
|
int glyph = charset_decode(f->charset, *str++);
|
||||||
|
if(glyph > 0) width += f->sized_data[glyph] + 1;
|
||||||
|
}
|
||||||
|
*w = width - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* dtext() - display a string of text */
|
/* dtext() - display a string of text */
|
||||||
void dtext(int x, int y, const char *str, color_t color)
|
void dtext(int x, int y, const char *str, color_t fg, color_t bg)
|
||||||
{
|
{
|
||||||
if((uint)color >= 8) return;
|
if((uint)fg >= 8 || (uint)bg >= 8) return;
|
||||||
topti_render(x, y, str, topti_font, topti_asm_text[color]);
|
topti_render(x, y, str, topti_font, topti_asm_text[fg],
|
||||||
|
topti_asm_text[bg]);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue