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

196
osd.cpp
View File

@@ -77,12 +77,12 @@ static int osdbufpos = 0;
static int osdset = 0;
char framebuffer[16][256];
void framebuffer_clear()
static void framebuffer_clear()
{
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));
}
@@ -221,6 +221,27 @@ static void osd_start(int line)
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>
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 (i == 0 && (n < osd_size))
{ // Render sidestripe
unsigned char j;
unsigned char tmp[8];
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];
}
// 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;
draw_title(p);
i += 22;
}
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)
{
unsigned short i;
const unsigned char *p;
int linelimit = OSDLINELEN;
int mag = (osd_size / 8);
uint n = row * mag;
@@ -380,30 +380,12 @@ void OsdDrawLogo(int row)
char *bg = framebuffer[n + k];
i = 0;
while(i < linelimit)
int i = 0;
while(i < OSDLINELEN)
{
if (i == 0)
{
unsigned char j;
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;
draw_title(&titlebuffer[(osd_size - 1 - n - k) * 8]);
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_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)
{
@@ -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
}
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);
}
char* OsdCoreName()
char* OsdCoreNameGet()
{
return lastcorename;
}

2
osd.h
View File

@@ -34,7 +34,7 @@ void StarsUpdate();
// get/set core currently loaded
void OsdCoreNameSet(const char* str);
char* OsdCoreName();
char* OsdCoreNameGet();
void OsdSetSize(int n);
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
sprintf(helptext_custom, " ");
strcat(helptext_custom, OsdCoreName());
strcat(helptext_custom, OsdCoreNameGet());
strcat(helptext_custom, " ");
strcat(helptext_custom, SHARPMZ_HELPTEXT[0]);
*helptext = helptext_custom;

View File

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