osd: some refactoring.

This commit is contained in:
sorgelig
2020-04-20 21:35:01 +08:00
parent e9eebbe260
commit 47b1ab4a61
5 changed files with 84 additions and 130 deletions

View File

@@ -1230,7 +1230,7 @@ void HandleUI(void)
// set helptext with core display on top of basic info // set helptext with core display on top of basic info
sprintf(helptext_custom, HELPTEXT_SPACER); sprintf(helptext_custom, HELPTEXT_SPACER);
strcat(helptext_custom, OsdCoreName()); strcat(helptext_custom, OsdCoreNameGet());
strcat(helptext_custom, helptexts[HELPTEXT_MAIN]); strcat(helptext_custom, helptexts[HELPTEXT_MAIN]);
helptext = helptext_custom; helptext = helptext_custom;
break; break;
@@ -1344,7 +1344,7 @@ void HandleUI(void)
if (!p[0]) OsdCoreNameSet("8BIT"); if (!p[0]) OsdCoreNameSet("8BIT");
else OsdCoreNameSet(p); else OsdCoreNameSet(p);
OsdSetTitle(OsdCoreName(), 0); OsdSetTitle(OsdCoreNameGet());
dip_submenu = -1; dip_submenu = -1;
// add options as requested by core // add options as requested by core
@@ -1507,7 +1507,7 @@ void HandleUI(void)
if (p[0] == 'V') if (p[0] == 'V')
{ {
// get version string // get version string
strcpy(s, OsdCoreName()); strcpy(s, OsdCoreNameGet());
strcat(s, " "); strcat(s, " ");
substrcpy(s + strlen(s), p, 1); substrcpy(s + strlen(s), p, 1);
OsdCoreNameSet(s); OsdCoreNameSet(s);
@@ -1540,7 +1540,7 @@ void HandleUI(void)
// set helptext with core display on top of basic info // set helptext with core display on top of basic info
sprintf(helptext_custom, HELPTEXT_SPACER); sprintf(helptext_custom, HELPTEXT_SPACER);
strcat(helptext_custom, OsdCoreName()); strcat(helptext_custom, OsdCoreNameGet());
strcat(helptext_custom, helptexts[HELPTEXT_MAIN]); strcat(helptext_custom, helptexts[HELPTEXT_MAIN]);
helptext = helptext_custom; helptext = helptext_custom;
@@ -2741,12 +2741,12 @@ void HandleUI(void)
s[0] = 0; s[0] = 0;
{ {
int len = strlen(OsdCoreName()); int len = strlen(OsdCoreNameGet());
if (len > 30) len = 30; if (len > 30) len = 30;
int sp = (30 - len) / 2; int sp = (30 - len) / 2;
for (int i = 0; i < sp; i++) strcat(s, " "); for (int i = 0; i < sp; i++) strcat(s, " ");
char *s2 = s + strlen(s); char *s2 = s + strlen(s);
char *s3 = OsdCoreName(); char *s3 = OsdCoreNameGet();
for (int i = 0; i < len; i++) *s2++ = *s3++; for (int i = 0; i < len; i++) *s2++ = *s3++;
*s2++ = 0; *s2++ = 0;
} }

196
osd.cpp
View File

@@ -77,12 +77,12 @@ static int osdbufpos = 0;
static int osdset = 0; static int osdset = 0;
char framebuffer[16][256]; char framebuffer[16][256];
void framebuffer_clear() static void framebuffer_clear()
{ {
memset(framebuffer, 0, sizeof(framebuffer)); memset(framebuffer, 0, sizeof(framebuffer));
} }
void framebuffer_plot(int x, int y) static void framebuffer_plot(int x, int y)
{ {
framebuffer[y / 8][x] |= (1 << (y & 7)); framebuffer[y / 8][x] |= (1 << (y & 7));
} }
@@ -221,6 +221,27 @@ static void osd_start(int line)
osdbufpos = line * 256; osdbufpos = line * 256;
} }
static void draw_title(const unsigned char *p)
{
// left white border
osdbuf[osdbufpos++] = 0xff;
osdbuf[osdbufpos++] = 0xff;
osdbuf[osdbufpos++] = 0xff;
for (int i = 0; i < 8; i++)
{
osdbuf[osdbufpos++] = 255 ^ *p;
osdbuf[osdbufpos++] = 255 ^ *p++;
}
// right white border
osdbuf[osdbufpos++] = 0xff;
// blue gap
osdbuf[osdbufpos++] = 0;
osdbuf[osdbufpos++] = 0;
}
// write a null-terminated string <s> to the OSD buffer starting at line <n> // write a null-terminated string <s> to the OSD buffer starting at line <n>
void OsdWriteOffset(unsigned char n, const char *s, unsigned char invert, unsigned char stipple, char offset, char leftchar, char usebg, int maxinv) void OsdWriteOffset(unsigned char n, const char *s, unsigned char invert, unsigned char stipple, char offset, char leftchar, char usebg, int maxinv)
{ {
@@ -252,7 +273,6 @@ void OsdWriteOffset(unsigned char n, const char *s, unsigned char invert, unsign
if (invert && i / 8 >= maxinv) invert = 0; if (invert && i / 8 >= maxinv) invert = 0;
if (i == 0 && (n < osd_size)) if (i == 0 && (n < osd_size))
{ // Render sidestripe { // Render sidestripe
unsigned char j;
unsigned char tmp[8]; unsigned char tmp[8];
if (leftchar) if (leftchar)
@@ -267,23 +287,7 @@ void OsdWriteOffset(unsigned char n, const char *s, unsigned char invert, unsign
p = &titlebuffer[(osd_size - 1 - n) * 8]; p = &titlebuffer[(osd_size - 1 - n) * 8];
} }
// left white border draw_title(p);
osdbuf[osdbufpos++] = 0xff;
osdbuf[osdbufpos++] = 0xff;
for (j = 0; j < 8; j++)
{
osdbuf[osdbufpos++] = 255 ^ *p;
osdbuf[osdbufpos++] = 255 ^ *p++;
}
// right white border
osdbuf[osdbufpos++] = 0xff;
osdbuf[osdbufpos++] = 0xff;
// blue gap
osdbuf[osdbufpos++] = 0;
osdbuf[osdbufpos++] = 0;
i += 22; i += 22;
} }
else if (n == (osd_size-1) && (arrowmask & OSD_ARROW_LEFT)) { // Draw initial arrow else if (n == (osd_size-1) && (arrowmask & OSD_ARROW_LEFT)) { // Draw initial arrow
@@ -362,10 +366,6 @@ void OsdWriteOffset(unsigned char n, const char *s, unsigned char invert, unsign
void OsdDrawLogo(int row) void OsdDrawLogo(int row)
{ {
unsigned short i;
const unsigned char *p;
int linelimit = OSDLINELEN;
int mag = (osd_size / 8); int mag = (osd_size / 8);
uint n = row * mag; uint n = row * mag;
@@ -380,30 +380,12 @@ void OsdDrawLogo(int row)
char *bg = framebuffer[n + k]; char *bg = framebuffer[n + k];
i = 0; int i = 0;
while(i < linelimit) while(i < OSDLINELEN)
{ {
if (i == 0) if (i == 0)
{ {
unsigned char j; draw_title(&titlebuffer[(osd_size - 1 - n - k) * 8]);
p = &titlebuffer[(osd_size - 1 - n - k) * 8];
// left white border
osdbuf[osdbufpos++] = 0xff;
osdbuf[osdbufpos++] = 0xff;
for (j = 0; j < 8; j++)
{
osdbuf[osdbufpos++] = 255 ^ *p;
osdbuf[osdbufpos++] = 255 ^ *p++;
}
// right white border
osdbuf[osdbufpos++] = 0xff;
osdbuf[osdbufpos++] = 0xff;
// blue gap
osdbuf[osdbufpos++] = 0;
osdbuf[osdbufpos++] = 0;
i += 22; i += 22;
} }
@@ -424,80 +406,6 @@ void OsdDrawLogo(int row)
} }
} }
// write a null-terminated string <s> to the OSD buffer starting at line <n>
void OSD_PrintText(unsigned char line, const char *hdr, const char *text, unsigned long start, unsigned long width, unsigned long offset, unsigned char invert)
{
// line : OSD line number (0-7)
// text : pointer to null-terminated string
// start : start position (in pixels)
// width : printed text length in pixels
// offset : scroll offset in pixels counting from the start of the string (0-7)
// invert : invertion flag
const unsigned char *p;
int i, j;
// select buffer and line to write to
osd_start(line);
if (invert) invert = 0xff;
p = &titlebuffer[(osd_size - 1 - line) * 8];
if (start>2)
{
osdbuf[osdbufpos++] = 0xff;
osdbuf[osdbufpos++] = 0xff;
start -= 2;
}
i = start>16 ? 16 : start;
for (j = 0; j<(i / 2); ++j)
{
osdbuf[osdbufpos++] = 255 ^ *p;
osdbuf[osdbufpos++] = 255 ^ *p++;
}
if (i & 1) osdbuf[osdbufpos++] = 255 ^ *p;
start -= i;
if (start>2)
{
osdbuf[osdbufpos++] = 0xff;
osdbuf[osdbufpos++] = 0xff;
start -= 2;
}
while (start--) osdbuf[osdbufpos++] = 0x00;
while(*hdr)
{
width -= 8;
p = charfont[(uint)(*hdr++)];
for (int i = 0; i < 8; i++) osdbuf[osdbufpos++] = *p++ ^ invert;
}
if (offset)
{
width -= 8 - offset;
p = &charfont[(uint)(*text++)][offset];
for (; offset < 8; offset++) osdbuf[osdbufpos++] = *p++ ^ invert;
}
while (width > 8)
{
unsigned char b;
p = &charfont[(uint)(*text++)][0];
for (b = 0; b < 8; b++) osdbuf[osdbufpos++] = *p++ ^ invert;
width -= 8;
}
if (width)
{
p = &charfont[(uint)(*text++)][0];
while (width--) osdbuf[osdbufpos++] = *p++ ^ invert;
}
}
#define INFO_MAXW 32 #define INFO_MAXW 32
#define INFO_MAXH 16 #define INFO_MAXH 16
@@ -626,6 +534,52 @@ void OsdMenuCtl(int en)
} }
} }
// write a null-terminated string <s> to the OSD buffer starting at line <n>
static void print_line(unsigned char line, const char *hdr, const char *text, unsigned long width, unsigned long offset, unsigned char invert)
{
// line : OSD line number (0-7)
// text : pointer to null-terminated string
// start : start position (in pixels)
// width : printed text length in pixels
// offset : scroll offset in pixels counting from the start of the string (0-7)
// invert : invertion flag
const unsigned char *p;
if (invert) invert = 0xff;
// select buffer and line to write to
osd_start(line);
draw_title(&titlebuffer[(osd_size - 1 - line) * 8]);
while (*hdr)
{
width -= 8;
p = charfont[(uint)(*hdr++)];
for (int i = 0; i < 8; i++) osdbuf[osdbufpos++] = *p++ ^ invert;
}
if (offset)
{
width -= 8 - offset;
p = &charfont[(uint)(*text++)][offset];
for (; offset < 8; offset++) osdbuf[osdbufpos++] = *p++ ^ invert;
}
while (width > 8)
{
unsigned char b;
p = &charfont[(uint)(*text++)][0];
for (b = 0; b < 8; b++) osdbuf[osdbufpos++] = *p++ ^ invert;
width -= 8;
}
if (width)
{
p = &charfont[(uint)(*text++)][0];
while (width--) osdbuf[osdbufpos++] = *p++ ^ invert;
}
}
void ScrollText(char n, const char *str, int off, int len, int max_len, unsigned char invert) void ScrollText(char n, const char *str, int off, int len, int max_len, unsigned char invert)
{ {
@@ -670,7 +624,7 @@ void ScrollText(char n, const char *str, int off, int len, int max_len, unsigned
strncpy(s + len + BLANKSPACE, str, max_len - len - BLANKSPACE); // repeat the name after its end and predefined number of blank space strncpy(s + len + BLANKSPACE, str, max_len - len - BLANKSPACE); // repeat the name after its end and predefined number of blank space
} }
OSD_PrintText(n, hdr, s, 22, (max_len - 1) << 3, (scroll_offset & 0x7), invert); // OSD print function with pixel precision print_line(n, hdr, s, (max_len - 1) << 3, (scroll_offset & 0x7), invert); // OSD print function with pixel precision
} }
} }
} }
@@ -688,7 +642,7 @@ void OsdCoreNameSet(const char* str)
sprintf(lastcorename, "%s", str); sprintf(lastcorename, "%s", str);
} }
char* OsdCoreName() char* OsdCoreNameGet()
{ {
return lastcorename; return lastcorename;
} }

2
osd.h
View File

@@ -34,7 +34,7 @@ void StarsUpdate();
// get/set core currently loaded // get/set core currently loaded
void OsdCoreNameSet(const char* str); void OsdCoreNameSet(const char* str);
char* OsdCoreName(); char* OsdCoreNameGet();
void OsdSetSize(int n); void OsdSetSize(int n);
int OsdGetSize(); int OsdGetSize();

View File

@@ -2063,7 +2063,7 @@ void sharpmz_ui(int idleState, int idle2State, int system
// set helptext with core display on top of basic info // set helptext with core display on top of basic info
sprintf(helptext_custom, " "); sprintf(helptext_custom, " ");
strcat(helptext_custom, OsdCoreName()); strcat(helptext_custom, OsdCoreNameGet());
strcat(helptext_custom, " "); strcat(helptext_custom, " ");
strcat(helptext_custom, SHARPMZ_HELPTEXT[0]); strcat(helptext_custom, SHARPMZ_HELPTEXT[0]);
*helptext = helptext_custom; *helptext = helptext_custom;

View File

@@ -455,7 +455,7 @@ static void parse_config()
{ {
// get version string // get version string
char s[128]; char s[128];
strcpy(s, OsdCoreName()); strcpy(s, OsdCoreNameGet());
strcat(s, " "); strcat(s, " ");
substrcpy(s + strlen(s), p, 1); substrcpy(s + strlen(s), p, 1);
OsdCoreNameSet(s); OsdCoreNameSet(s);