mirror of
https://github.com/opentx/opentx.git
synced 2025-07-15 12:25:12 +03:00
[Horus] Fontcache added. Should improve a lot the menus speed.
This commit is contained in:
parent
27d37f7b78
commit
3cd6638e01
9 changed files with 110 additions and 46 deletions
|
@ -26,6 +26,9 @@
|
||||||
extern const uint16_t * const fontspecsTable[16];
|
extern const uint16_t * const fontspecsTable[16];
|
||||||
extern const uint8_t * const fontsTable[16];
|
extern const uint8_t * const fontsTable[16];
|
||||||
|
|
||||||
|
extern BitmapBuffer * fontCache[2];
|
||||||
|
void loadFontCache();
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
extern const pm_uchar font_5x7[];
|
extern const pm_uchar font_5x7[];
|
||||||
|
|
|
@ -247,8 +247,7 @@ void BitmapBuffer::drawBitmapPattern(coord_t x, coord_t y, const uint8_t * bmp,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#define FONT_MAX_HEIGHT 42
|
void BitmapBuffer::drawCharWithoutCache(coord_t x, coord_t y, const uint8_t * font, const uint16_t * spec, int index, LcdFlags flags)
|
||||||
void BitmapBuffer::drawFontPattern(coord_t x, coord_t y, const uint8_t * font, const uint16_t * spec, int index, LcdFlags flags)
|
|
||||||
{
|
{
|
||||||
coord_t offset = spec[index];
|
coord_t offset = spec[index];
|
||||||
coord_t width = spec[index+1] - offset;
|
coord_t width = spec[index+1] - offset;
|
||||||
|
@ -256,6 +255,14 @@ void BitmapBuffer::drawFontPattern(coord_t x, coord_t y, const uint8_t * font, c
|
||||||
lcdNextPos = x + width;
|
lcdNextPos = x + width;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BitmapBuffer::drawCharWithCache(coord_t x, coord_t y, const BitmapBuffer * font, const uint16_t * spec, int index, LcdFlags flags)
|
||||||
|
{
|
||||||
|
coord_t offset = spec[index];
|
||||||
|
coord_t width = spec[index+1] - offset;
|
||||||
|
drawBitmap(x, y, font, offset, 0, width);
|
||||||
|
lcdNextPos = x + width;
|
||||||
|
}
|
||||||
|
|
||||||
void BitmapBuffer::drawSizedText(coord_t x, coord_t y, const char * s, uint8_t len, LcdFlags flags)
|
void BitmapBuffer::drawSizedText(coord_t x, coord_t y, const char * s, uint8_t len, LcdFlags flags)
|
||||||
{
|
{
|
||||||
int width = getTextWidth(s, len, flags);
|
int width = getTextWidth(s, len, flags);
|
||||||
|
@ -263,6 +270,7 @@ void BitmapBuffer::drawSizedText(coord_t x, coord_t y, const char * s, uint8_t l
|
||||||
int fontindex = FONTSIZE(flags) >> 8;
|
int fontindex = FONTSIZE(flags) >> 8;
|
||||||
const pm_uchar * font = fontsTable[fontindex];
|
const pm_uchar * font = fontsTable[fontindex];
|
||||||
const uint16_t * fontspecs = fontspecsTable[fontindex];
|
const uint16_t * fontspecs = fontspecsTable[fontindex];
|
||||||
|
BitmapBuffer * fontcache = NULL;
|
||||||
|
|
||||||
if (flags & RIGHT)
|
if (flags & RIGHT)
|
||||||
x -= width;
|
x -= width;
|
||||||
|
@ -271,12 +279,32 @@ void BitmapBuffer::drawSizedText(coord_t x, coord_t y, const char * s, uint8_t l
|
||||||
|
|
||||||
if ((flags&INVERS) && ((~flags & BLINK) || BLINK_ON_PHASE)) {
|
if ((flags&INVERS) && ((~flags & BLINK) || BLINK_ON_PHASE)) {
|
||||||
flags = TEXT_INVERTED_COLOR | (flags & 0x0ffff);
|
flags = TEXT_INVERTED_COLOR | (flags & 0x0ffff);
|
||||||
if (FONTSIZE(flags) == TINSIZE)
|
if (fontindex == TINSIZE_INDEX) {
|
||||||
drawSolidFilledRect(x-INVERT_HORZ_MARGIN+2, y-INVERT_VERT_MARGIN+2, width+2*INVERT_HORZ_MARGIN-5, INVERT_LINE_HEIGHT-7, TEXT_INVERTED_BGCOLOR);
|
drawSolidFilledRect(x-INVERT_HORZ_MARGIN+2, y-INVERT_VERT_MARGIN+2, width+2*INVERT_HORZ_MARGIN-5, INVERT_LINE_HEIGHT-7, TEXT_INVERTED_BGCOLOR);
|
||||||
else if (FONTSIZE(flags) == SMLSIZE)
|
}
|
||||||
|
else if (fontindex == SMLSIZE_INDEX) {
|
||||||
drawSolidFilledRect(x-INVERT_HORZ_MARGIN, y+1, width+2*INVERT_HORZ_MARGIN-2, INVERT_LINE_HEIGHT-5, TEXT_INVERTED_BGCOLOR);
|
drawSolidFilledRect(x-INVERT_HORZ_MARGIN, y+1, width+2*INVERT_HORZ_MARGIN-2, INVERT_LINE_HEIGHT-5, TEXT_INVERTED_BGCOLOR);
|
||||||
else
|
}
|
||||||
drawSolidFilledRect(x-INVERT_HORZ_MARGIN, y, width+2*INVERT_HORZ_MARGIN, INVERT_LINE_HEIGHT, TEXT_INVERTED_BGCOLOR);
|
else if (fontindex == STDSIZE_INDEX) {
|
||||||
|
drawSolidFilledRect(x-INVERT_HORZ_MARGIN, y, INVERT_HORZ_MARGIN, INVERT_LINE_HEIGHT, TEXT_INVERTED_BGCOLOR);
|
||||||
|
drawSolidFilledRect(x+width, y, INVERT_HORZ_MARGIN, INVERT_LINE_HEIGHT, TEXT_INVERTED_BGCOLOR);
|
||||||
|
fontcache = fontCache[1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (!(flags & NO_FONTCACHE)) {
|
||||||
|
if (fontindex == STDSIZE_INDEX) {
|
||||||
|
uint16_t fgColor = lcdColorTable[COLOR_IDX(flags)];
|
||||||
|
uint16_t bgColor = *getPixelPtr(x, y);
|
||||||
|
if (fgColor == lcdColorTable[TEXT_COLOR_INDEX] && bgColor == lcdColorTable[TEXT_BGCOLOR_INDEX]) {
|
||||||
|
fontcache = fontCache[0];
|
||||||
|
}
|
||||||
|
else if (fgColor == lcdColorTable[TEXT_INVERTED_COLOR_INDEX] && bgColor == lcdColorTable[TEXT_INVERTED_BGCOLOR_INDEX]) {
|
||||||
|
fontcache = fontCache[1];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// TRACE("No cache for \"%s\"", s);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const coord_t orig_x = x;
|
const coord_t orig_x = x;
|
||||||
|
@ -295,7 +323,12 @@ void BitmapBuffer::drawSizedText(coord_t x, coord_t y, const char * s, uint8_t l
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else if (c >= 0x20) {
|
else if (c >= 0x20) {
|
||||||
drawFontPattern(x, y, font, fontspecs, getMappedChar(c), flags);
|
if (fontcache) {
|
||||||
|
drawCharWithCache(x, y, fontcache, fontspecs, getMappedChar(c), flags);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
drawCharWithoutCache(x, y, font, fontspecs, getMappedChar(c), flags);
|
||||||
|
}
|
||||||
x = lcdNextPos;
|
x = lcdNextPos;
|
||||||
}
|
}
|
||||||
else if (c == 0x1F) { // X-coord prefix
|
else if (c == 0x1F) { // X-coord prefix
|
||||||
|
|
|
@ -176,7 +176,9 @@ class BitmapBuffer: public BitmapBufferBase<uint16_t>
|
||||||
|
|
||||||
void drawBitmapPattern(coord_t x, coord_t y, const uint8_t * bmp, LcdFlags flags, coord_t offset=0, coord_t width=0);
|
void drawBitmapPattern(coord_t x, coord_t y, const uint8_t * bmp, LcdFlags flags, coord_t offset=0, coord_t width=0);
|
||||||
|
|
||||||
void drawFontPattern(coord_t x, coord_t y, const uint8_t * font, const uint16_t * spec, int index, LcdFlags flags);
|
void drawCharWithoutCache(coord_t x, coord_t y, const uint8_t * font, const uint16_t * spec, int index, LcdFlags flags);
|
||||||
|
|
||||||
|
void drawCharWithCache(coord_t x, coord_t y, const BitmapBuffer * font, const uint16_t * spec, int index, LcdFlags flags);
|
||||||
|
|
||||||
void drawText(coord_t x, coord_t y, const char * s, LcdFlags flags)
|
void drawText(coord_t x, coord_t y, const char * s, LcdFlags flags)
|
||||||
{
|
{
|
||||||
|
|
|
@ -78,3 +78,23 @@ pm_uchar font_stdsizebold[] = {
|
||||||
|
|
||||||
const uint16_t * const fontspecsTable[16] = { font_stdsize_specs, font_tinsize_specs, font_smlsize_specs, font_midsize_specs, font_dblsize_specs, font_xxlsize_specs, font_stdsizebold_specs };
|
const uint16_t * const fontspecsTable[16] = { font_stdsize_specs, font_tinsize_specs, font_smlsize_specs, font_midsize_specs, font_dblsize_specs, font_xxlsize_specs, font_stdsizebold_specs };
|
||||||
const uint8_t * const fontsTable[16] = { font_stdsize, font_tinsize, font_smlsize, font_midsize, font_dblsize, font_xxlsize, font_stdsizebold };
|
const uint8_t * const fontsTable[16] = { font_stdsize, font_tinsize, font_smlsize, font_midsize, font_dblsize, font_xxlsize, font_stdsizebold };
|
||||||
|
|
||||||
|
BitmapBuffer * fontCache[2];
|
||||||
|
|
||||||
|
BitmapBuffer * createFontCache(const uint8_t * font, LcdFlags fg, LcdFlags bg)
|
||||||
|
{
|
||||||
|
coord_t width = *((uint16_t *)font);
|
||||||
|
coord_t height = *(((uint16_t *)font)+1);
|
||||||
|
|
||||||
|
BitmapBuffer * buffer = new BitmapBuffer(BMP_RGB565, width, height);
|
||||||
|
buffer->clear(bg);
|
||||||
|
buffer->drawBitmapPattern(0, 0, font, fg);
|
||||||
|
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
void loadFontCache()
|
||||||
|
{
|
||||||
|
fontCache[0] = createFontCache(fontsTable[0], TEXT_COLOR, TEXT_BGCOLOR);
|
||||||
|
fontCache[1] = createFontCache(fontsTable[0], TEXT_INVERTED_COLOR, TEXT_INVERTED_BGCOLOR);
|
||||||
|
}
|
||||||
|
|
|
@ -62,20 +62,29 @@
|
||||||
/* telemetry flags */
|
/* telemetry flags */
|
||||||
#define NO_UNIT 0x40
|
#define NO_UNIT 0x40
|
||||||
|
|
||||||
|
enum FontSizeIndex {
|
||||||
|
STDSIZE_INDEX,
|
||||||
|
TINSIZE_INDEX,
|
||||||
|
SMLSIZE_INDEX,
|
||||||
|
MIDSIZE_INDEX,
|
||||||
|
DBLSIZE_INDEX,
|
||||||
|
XXLSIZE_INDEX
|
||||||
|
};
|
||||||
|
|
||||||
#define FONTSIZE(x) ((x) & 0x0700)
|
#define FONTSIZE(x) ((x) & 0x0700)
|
||||||
#define TINSIZE 0x0100
|
#define TINSIZE (TINSIZE_INDEX << 8)
|
||||||
#define SMLSIZE 0x0200
|
#define SMLSIZE (SMLSIZE_INDEX << 8)
|
||||||
#define MIDSIZE 0x0300
|
#define MIDSIZE (MIDSIZE_INDEX << 8)
|
||||||
#define DBLSIZE 0x0400
|
#define DBLSIZE (DBLSIZE_INDEX << 8)
|
||||||
#define XXLSIZE 0x0500
|
#define XXLSIZE (XXLSIZE_INDEX << 8)
|
||||||
#define BOLD 0x0600
|
#define BOLD 0x0600
|
||||||
#define VERTICAL 0x0800
|
#define VERTICAL 0x0800
|
||||||
|
|
||||||
#define TIMEBLINK 0x1000
|
#define TIMEBLINK 0x1000
|
||||||
#define TIMEHOUR 0x2000
|
#define TIMEHOUR 0x2000
|
||||||
#define STREXPANDED 0x4000
|
#define NO_FONTCACHE 0x8000
|
||||||
|
|
||||||
#include "colors.h"
|
#include "colors.h"
|
||||||
|
|
||||||
#define DISPLAY_PIXELS_COUNT (LCD_W*LCD_H)
|
#define DISPLAY_PIXELS_COUNT (LCD_W*LCD_H)
|
||||||
#define DISPLAY_BUFFER_SIZE (sizeof(display_t)*DISPLAY_PIXELS_COUNT)
|
#define DISPLAY_BUFFER_SIZE (sizeof(display_t)*DISPLAY_PIXELS_COUNT)
|
||||||
|
|
||||||
|
|
|
@ -233,7 +233,7 @@ bool menuModelExpoOne(evt_t event)
|
||||||
|
|
||||||
case EXPO_FIELD_SOURCE:
|
case EXPO_FIELD_SOURCE:
|
||||||
lcdDrawText(MENUS_MARGIN_LEFT, y, NO_INDENT(STR_SOURCE));
|
lcdDrawText(MENUS_MARGIN_LEFT, y, NO_INDENT(STR_SOURCE));
|
||||||
putsMixerSource(EXPO_ONE_2ND_COLUMN, y, ed->srcRaw, STREXPANDED|(menuHorizontalPosition==0?attr:0));
|
putsMixerSource(EXPO_ONE_2ND_COLUMN, y, ed->srcRaw, menuHorizontalPosition==0 ? attr : 0);
|
||||||
if (attr && menuHorizontalPosition==0) ed->srcRaw = checkIncDec(event, ed->srcRaw, INPUTSRC_FIRST, INPUTSRC_LAST, EE_MODEL|INCDEC_SOURCE|NO_INCDEC_MARKS, isInputSourceAvailable);
|
if (attr && menuHorizontalPosition==0) ed->srcRaw = checkIncDec(event, ed->srcRaw, INPUTSRC_FIRST, INPUTSRC_LAST, EE_MODEL|INCDEC_SOURCE|NO_INCDEC_MARKS, isInputSourceAvailable);
|
||||||
if (ed->srcRaw >= MIXSRC_FIRST_TELEM) {
|
if (ed->srcRaw >= MIXSRC_FIRST_TELEM) {
|
||||||
putsTelemetryChannelValue(EXPO_ONE_2ND_COLUMN+60, y, (ed->srcRaw - MIXSRC_FIRST_TELEM)/3, convertTelemValue(ed->srcRaw - MIXSRC_FIRST_TELEM + 1, ed->scale), LEFT|(menuHorizontalPosition==1?attr:0));
|
putsTelemetryChannelValue(EXPO_ONE_2ND_COLUMN+60, y, (ed->srcRaw - MIXSRC_FIRST_TELEM)/3, convertTelemValue(ed->srcRaw - MIXSRC_FIRST_TELEM + 1, ed->scale), LEFT|(menuHorizontalPosition==1?attr:0));
|
||||||
|
|
|
@ -201,7 +201,7 @@ bool menuModelMixOne(evt_t event)
|
||||||
break;
|
break;
|
||||||
case MIX_FIELD_SOURCE:
|
case MIX_FIELD_SOURCE:
|
||||||
lcdDrawText(MENUS_MARGIN_LEFT, y, NO_INDENT(STR_SOURCE));
|
lcdDrawText(MENUS_MARGIN_LEFT, y, NO_INDENT(STR_SOURCE));
|
||||||
putsMixerSource(MIXES_2ND_COLUMN, y, md2->srcRaw, STREXPANDED|attr);
|
putsMixerSource(MIXES_2ND_COLUMN, y, md2->srcRaw, attr);
|
||||||
if (attr) CHECK_INCDEC_MODELSOURCE(event, md2->srcRaw, 1, MIXSRC_LAST);
|
if (attr) CHECK_INCDEC_MODELSOURCE(event, md2->srcRaw, 1, MIXSRC_LAST);
|
||||||
break;
|
break;
|
||||||
case MIX_FIELD_WEIGHT:
|
case MIX_FIELD_WEIGHT:
|
||||||
|
|
|
@ -105,7 +105,7 @@ void editTimerMode(int timerIdx, coord_t y, LcdFlags attr, evt_t event)
|
||||||
}
|
}
|
||||||
drawStringWithIndex(MENUS_MARGIN_LEFT, y, STR_TIMER, timerIdx+1);
|
drawStringWithIndex(MENUS_MARGIN_LEFT, y, STR_TIMER, timerIdx+1);
|
||||||
putsTimerMode(MODEL_SETUP_2ND_COLUMN, y, timer->mode, (menuHorizontalPosition<=0 ? attr : 0));
|
putsTimerMode(MODEL_SETUP_2ND_COLUMN, y, timer->mode, (menuHorizontalPosition<=0 ? attr : 0));
|
||||||
putsTimer(MODEL_SETUP_2ND_COLUMN+50, y, timer->start, (menuHorizontalPosition==1 ? attr|TIMEHOUR : TIMEHOUR));
|
putsTimer(MODEL_SETUP_2ND_COLUMN+50, y, timer->start, (menuHorizontalPosition!=0 ? attr|TIMEHOUR : TIMEHOUR));
|
||||||
if (attr && s_editMode>0) {
|
if (attr && s_editMode>0) {
|
||||||
switch (menuHorizontalPosition) {
|
switch (menuHorizontalPosition) {
|
||||||
case 0:
|
case 0:
|
||||||
|
@ -203,14 +203,10 @@ bool menuModelSetup(evt_t event)
|
||||||
IF_EXTERNAL_MODULE_XJT(FAILSAFE_ROWS(EXTERNAL_MODULE)),
|
IF_EXTERNAL_MODULE_XJT(FAILSAFE_ROWS(EXTERNAL_MODULE)),
|
||||||
LABEL(Trainer), 0, TRAINER_CHANNELS_ROWS(), IF_TRAINER_ON(2) });
|
LABEL(Trainer), 0, TRAINER_CHANNELS_ROWS(), IF_TRAINER_ON(2) });
|
||||||
|
|
||||||
#if (defined(DSM2) || defined(PXX))
|
|
||||||
if (menuEvent) {
|
if (menuEvent) {
|
||||||
moduleFlag[0] = 0;
|
moduleFlag[0] = 0;
|
||||||
#if NUM_MODULES > 1
|
|
||||||
moduleFlag[1] = 0;
|
moduleFlag[1] = 0;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
int sub = menuVerticalPosition;
|
int sub = menuVerticalPosition;
|
||||||
|
|
||||||
|
|
|
@ -2609,6 +2609,7 @@ void opentxInit(OPENTX_INIT_ARGS)
|
||||||
|
|
||||||
#if defined(COLORLCD)
|
#if defined(COLORLCD)
|
||||||
loadTheme();
|
loadTheme();
|
||||||
|
loadFontCache();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (g_eeGeneral.backlightMode != e_backlight_mode_off) backlightOn(); // on Tx start turn the light on
|
if (g_eeGeneral.backlightMode != e_backlight_mode_off) backlightOn(); // on Tx start turn the light on
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue