diff options
author | Uros Majstorovic <majstor@majstor.org> | 2020-06-12 00:51:04 +0200 |
---|---|---|
committer | Uros Majstorovic <majstor@majstor.org> | 2020-06-12 00:51:04 +0200 |
commit | e5fcdeda041831cb326f1d1963c0651b78041788 (patch) | |
tree | 3763f5c596b068ec7b3a71c1db02f6c9936a3bcb | |
parent | 6d868629c96f53358f1b7e2f6ac687d7b7195b35 (diff) |
implemented font metrics
-rw-r--r-- | code/fe310/eos/eve/eve.c | 26 | ||||
-rw-r--r-- | code/fe310/eos/eve/eve.h | 3 | ||||
-rw-r--r-- | code/fe310/eos/eve/screen/font.c | 9 | ||||
-rw-r--r-- | code/fe310/eos/eve/screen/font.h | 3 | ||||
-rw-r--r-- | code/fe310/eos/eve/widget/text.c | 12 |
5 files changed, 43 insertions, 10 deletions
diff --git a/code/fe310/eos/eve/eve.c b/code/fe310/eos/eve/eve.c index 0ab5427..1db5744 100644 --- a/code/fe310/eos/eve/eve.c +++ b/code/fe310/eos/eve/eve.c @@ -70,6 +70,28 @@ void eve_write32(uint32_t addr, uint32_t data) { eve_spi_cs_clear(); } +void eve_readb(uint32_t addr, uint8_t *b, size_t size) { + int i; + + eve_spi_cs_set(); + eve_spi_xchg32(addr << 8, 0); + for (i=0; i<size; i++) { + b[i] = eve_spi_xchg8(0, 0); + } + eve_spi_cs_clear(); +} + +void eve_writeb(uint32_t addr, uint8_t *b, size_t size) { + int i; + + eve_spi_cs_set(); + eve_spi_xchg24(addr | EVE_MEM_WRITE, 0); + for (i=0; i<size; i++) { + eve_spi_xchg8(b[i], 0); + } + eve_spi_cs_clear(); +} + static void _dl_inc(uint32_t i) { _dl_addr += i; } @@ -316,9 +338,9 @@ static int _init(void) { /* do not set PCLK yet - wait for just after the first display list */ /* disable Audio */ - eve_write8(REG_VOL_PB, 0x00); /* turn recorded audio volume down */ + eve_write16(REG_SOUND, 0x0000); /* set synthesizer to silence */ eve_write8(REG_VOL_SOUND, 0x00); /* turn synthesizer volume off */ - eve_write16(REG_SOUND, 0x6000); /* set synthesizer to mute */ + eve_write8(REG_VOL_PB, 0x00); /* turn recorded audio volume off */ /* write a basic display-list to get things started */ eve_dl_start(EVE_RAM_DL); diff --git a/code/fe310/eos/eve/eve.h b/code/fe310/eos/eve/eve.h index c27d81f..5fd58df 100644 --- a/code/fe310/eos/eve/eve.h +++ b/code/fe310/eos/eve/eve.h @@ -31,6 +31,9 @@ void eve_write8(uint32_t addr, uint8_t data); void eve_write16(uint32_t addr, uint16_t data); void eve_write32(uint32_t addr, uint32_t data); +void eve_readb(uint32_t addr, uint8_t *b, size_t size); +void eve_writeb(uint32_t addr, uint8_t *b, size_t size); + void eve_dl_start(uint32_t addr); void eve_dl_write(uint32_t dl); void eve_dl_swap(void); diff --git a/code/fe310/eos/eve/screen/font.c b/code/fe310/eos/eve/screen/font.c index 26e7cf0..1be462d 100644 --- a/code/fe310/eos/eve/screen/font.c +++ b/code/fe310/eos/eve/screen/font.c @@ -4,14 +4,21 @@ #include "font.h" void eve_font_init(EVEFont *font, uint8_t font_id) { + uint32_t p; + + p = eve_read32(EVE_ROM_FONT_ADDR); + p += (148 * (font_id - 16)); font->id = font_id; + font->w = eve_read32(p + 136); + font->h = eve_read32(p + 140); + eve_readb(p, font->w_ch, 128); } uint16_t eve_font_string_width(EVEFont *font, char *s) { uint16_t r = 0; while (*s) { - r += font->w[*s]; + r += font->w_ch[*s]; s++; } return r; diff --git a/code/fe310/eos/eve/screen/font.h b/code/fe310/eos/eve/screen/font.h index 24b745e..a46c942 100644 --- a/code/fe310/eos/eve/screen/font.h +++ b/code/fe310/eos/eve/screen/font.h @@ -2,8 +2,9 @@ typedef struct EVEFont { uint8_t id; - uint8_t w[128]; + uint8_t w; uint8_t h; + uint8_t w_ch[128]; } EVEFont; void eve_font_init(EVEFont *font, uint8_t font_id); diff --git a/code/fe310/eos/eve/widget/text.c b/code/fe310/eos/eve/widget/text.c index 834729f..ae83656 100644 --- a/code/fe310/eos/eve/widget/text.c +++ b/code/fe310/eos/eve/widget/text.c @@ -284,7 +284,7 @@ void eve_textw_putc(void *_page, int c) { switch (c) { case CH_BS: if (cursor1->ch > 0) { - cursor1->x -= widget->font->w[*(text - 1)]; + cursor1->x -= widget->font->w_ch[*(text - 1)]; memmove(text - 1, text, widget->text_len - cursor1->ch + 1); widget->text_len--; cursor1->ch--; @@ -300,7 +300,7 @@ void eve_textw_putc(void *_page, int c) { break; default: if (widget->text_len < (widget->text_size - 1)) { - cursor1->x += widget->font->w[c]; + cursor1->x += widget->font->w_ch[c]; memmove(text + 1, text, widget->text_len - cursor1->ch + 1); *text = c; widget->text_len++; @@ -345,7 +345,7 @@ int eve_textw_update(EVETextWidget *widget, EVEPage *page, uint16_t line) { line_b = LINE_EMPTY; for (i=LINE_START(widget, line); i<widget->text_size; i++) { ch = widget->text[i]; - ch_w = widget->font->w[ch]; + ch_w = widget->font->w_ch[ch]; if (ch <= 0x20) { if ((ch == '\n') || (ch == '\0')) { if (widget->line[line] == i) return line; @@ -406,7 +406,7 @@ void eve_textw_cursor_update(EVETextWidget *widget, EVETextCursor *cursor) { x = 0; for (i=LINE_START(widget, cursor->line); i<LINE_END(widget, cursor->line); i++) { if (cursor->ch == i) break; - x += widget->font->w[widget->text[i]]; + x += widget->font->w_ch[widget->text[i]]; } cursor->x = x; } @@ -430,12 +430,12 @@ void eve_textw_cursor_set(EVETextWidget *widget, EVETextCursor *cursor, uint8_t _x = 0; _d = x; for (i=LINE_START(widget, cursor->line); i<LINE_END(widget, cursor->line); i++) { - _x += widget->font->w[widget->text[i]]; + _x += widget->font->w_ch[widget->text[i]]; if (_x >= x) { if (_x - x < _d) { i++; } else { - _x -= widget->font->w[widget->text[i]]; + _x -= widget->font->w_ch[widget->text[i]]; } break; } else { |