📄 osd.c
字号:
regs0->tlink_addr = region[0].osd_header[0];
regs0->blink_addr = region[0].osd_header[1];
regs0->osd_en = 1;
#if CONFIG==CONFIG_COMBO_SVCD
if(tv_wait_sync)
WAIT_VSYNC; //this action become effective when vsync only
#endif
}
//function: create region for interlace mode
//
//Note: the osd create region is addition the color mode for create
void osd_create_region(t_osd_region * p, int X, int Y, t_osd_region * prev,
BYTE bColorMode, BYTE bScanMode)
{
BYTE *ofrom = get_osdbuf_baseptr();
BYTE *obase;
UINT16 *pa;
UINT32 linkaddr;
int W, H, pn;
int j, i;
W = p->osd_w / 4; //width must times of 4
if(bScanMode == OSD_NONINTERLACED) //jhuang non-interlaced
H = p->osd_h; //bottom same to Top
else
H = p->osd_h / 2; //Top + bottom
for(i = 0; i < 2; i++)
{
obase = ofrom + (osd_free << 5);
//buffer must in 32 aligment
p->osd_header[i] = osd_free;
// get prev link address (for header generation)
linkaddr = (prev == NULL) ? LINK_NULL : prev->osd_header[i];
p->osd_format = bColorMode;
//setup header
switch (bColorMode)
{
case OSD_FORMAT_4COLOR:
#if 0
//if(IsKYSetup())
//{
// wbe32 (obase + 0,osd_header_hi (1, W, H, Y, X, 0, OSD_CLUT_4, 12, 4,linkaddr));
// wbe32 (obase + 4,osd_header_lo (1, W, H, Y, X, 0, OSD_CLUT_4, 12, 4,linkaddr));
// pn=4;
// pa = (UINT16 *) palette_4color_setup;
// }
//else
// {
// wbe32 (obase + 0,osd_header_hi (1, W, H, Y, X, 0, OSD_CLUT_4, 12, 15,linkaddr));
// wbe32 (obase + 4,osd_header_lo (1, W, H, Y, X, 0, OSD_CLUT_4, 12, 15,linkaddr));
// pn=4;
// pa = (UINT16 *) palette_4color;
// }
#endif
/* blending*VIDEO+(15-blending)*OSD */
#ifdef OSD_SHADE
wbe32(obase + 0, osd_header_hi(1, W, H, Y, X, 0, OSD_CLUT_4,
(IsNM9frame()||IsNMPreview())? 0 : 2,//8//jhuang 2002/12/2獺紈
(IsKYSetup()? 4 : 14), linkaddr));
wbe32(obase + 4, osd_header_lo(1, W, H, Y, X, 0, OSD_CLUT_4,
(IsNM9frame()||IsNMPreview())? 0 : 2,//8//jhuang 2002/12/2獺紈
(IsKYSetup()? 4 : 14), linkaddr));
#else
wbe32(obase + 0, osd_header_hi(1, W, H, Y, X, 0, OSD_CLUT_4, 12,
(IsKYSetup()? 4 : 15), linkaddr));
wbe32(obase + 4, osd_header_lo(1, W, H, Y, X, 0, OSD_CLUT_4, 12,
(IsKYSetup()? 4 : 15), linkaddr));
#endif
pn = 4;
if(IsKYSetup())
pa = (UINT16 *) palette_4color_setup;
else
pa = (UINT16 *) palette_4color;
break;
default: // 16color ,width X 2
wbe32(obase + 0,
osd_header_hi(1, W, H, Y, X, 1, OSD_CLUT_16, 12, 4, linkaddr));
wbe32(obase + 4,
osd_header_lo(1, W, H, Y, X, 1, OSD_CLUT_16, 12, 4, linkaddr));
pn = 16;
pa = (UINT16 *) palette_16color;
break;
}
obase += 8; // skip header region
//put color
do
{
wbe16(obase, *pa);
obase += 2;
pa++;
}
while(--pn > 0);
// clear OSD bitmap content
for(pn = H; pn > 0; pn--)
{
for(j = 0; j < W; j++)
((UINT32 *) obase)[j] = 0;
//next line
obase += (W << 2);
}
//aligment buffer on 32 byte start
osd_free = ((obase - ofrom) + 31) / 32;
//if on non-interface mode , display become top line= bottom line
if(bScanMode == OSD_NONINTERLACED)
{
p->osd_header[1] = p->osd_header[0];
break;
}
}
}
/*
**
*/
void InitSW_region(void)
{
UINT8 i, j;
//clear old message
for(i = 0; i < MAX_REGION; i++)
for(j = 0; j < MAX_SW_REGION; j++)
RegionStr[i][j][0] = 0;
}
/*
** FUNCTION
** osd_init
**
** DESCRIPTION
** initialize osd-printing function
*/
/*
** DVD version
**
*/
#ifndef SUPPORT_OSD_AUTO_INIT
void osd_init(void)
{
osd_disable();
// setup first free address
osd_free = addr_vxvy(0, 0);
// setup region 2 //56:interlaced;80:non-interlaced
region[2].osd_w = 35 * 4; //min 16*4 for vol control bar
region[2].osd_h = OSD_FONT_HEIGHT;
osd_create_region(®ion[2], 32, 80, NULL /*®ion[3] */ ,
OSD_FORMAT_4COLOR, OSD_NONINTERLACED);
// setup region 1 //40:interlaced;52:non-interlaced
region[1].osd_w = 35 * 4; //min 10*4 for vol control char
region[1].osd_h = OSD_FONT_HEIGHT;
osd_create_region(®ion[1], 32, 52, ®ion[2], OSD_FORMAT_4COLOR,
OSD_NONINTERLACED);
// setup region 0 //24:interlaced/non-interlaced
region[0].osd_w = 13 * 4; //min 8*4 for time display//BYTE PER PIXEL
region[0].osd_h = OSD_FONT_HEIGHT; //PIXEL
osd_create_region(®ion[0], 32, 24, ®ion[1], OSD_FORMAT_4COLOR,
OSD_NONINTERLACED);
#ifdef MONE_OSD_BUFFER
#if CONFIG==CONFIG_COMBO_SVCD
if((int)addr_vy(osd_free) >= (int)(MEM_AUDYA_DEF - MEM_OSDYA_DEF))
{
psprintf(linebuf, "OSD BUFFER OVERFLOW(osd_init).... %x(%x)\n",
addr_vy(osd_free), (MEM_AUDYA_DEF - MEM_OSDYA_DEF));
epp_write_slow(linebuf);
}
#else
if((int)addr_vy(osd_free) >= (int)OBV_H)
{
psprintf(linebuf, "OSD BUFFER OVERFLOW(osd_init).... %x(%x)\n",
addr_vy(osd_free), OBV_H);
epp_write_slow(linebuf);
}
#endif
#endif
ClearOsdMsg(0);
osd_enable();
}
/*
**
*/
void osd_init_preview(void)
{
#include "avd.h" //jhuang 2002/3/10
osd_disable();
// setup first free address
osd_free = addr_vxvy(0, 0);
#if CONFIG==CONFIG_COMBO_SVCD
// setup region 2 //56:interlaced;80:non-interlaced
region[4].osd_w = 25 * 4 + 4; //30 * 4;//min 16*4 for vol control bar
region[4].osd_h = 8; //OSD_FONT_HEIGHT;
osd_create_region(®ion[4], 35 /*78 */ , (IsAVDDisplayPAL()? 254 : 204),
NULL, OSD_FORMAT_4COLOR, OSD_NONINTERLACED);
// setup region 2 //56:interlaced;80:non-interlaced
region[3].osd_w = 25 * 4 + 4; //30 * 4;//min 16*4 for vol control bar
region[3].osd_h = 8; //OSD_FONT_HEIGHT;
osd_create_region(®ion[3], 35 /*78 */ , (IsAVDDisplayPAL()? 175 : 138),
®ion[4], OSD_FORMAT_4COLOR, OSD_NONINTERLACED);
// setup region 3 //56:interlaced;80:non-interlaced
region[2].osd_w = 25 * 4 + 4; //30 * 4;//min 16*4 for vol control bar
region[2].osd_h = 8; //OSD_FONT_HEIGHT;
osd_create_region(®ion[2], 35 /*78 */ , (IsAVDDisplayPAL()? 96 : 72),
®ion[3], OSD_FORMAT_4COLOR, OSD_NONINTERLACED);
// setup region 1 //40:interlaced;52:non-interlaced
region[1].osd_w = 14 * 4; //min 10*4 for vol control char
region[1].osd_h = OSD_FONT_HEIGHT;
osd_create_region(®ion[1], 32, (IsAVDDisplayPAL()? 52 : 40), ®ion[2],
OSD_FORMAT_4COLOR, OSD_NONINTERLACED);
// setup region 0 //24:interlaced/non-interlaced
region[0].osd_w = 8 * 4; //min 8*4 for time display//BYTE PER PIXEL
region[0].osd_h = OSD_FONT_HEIGHT; //PIXEL
osd_create_region(®ion[0], 32, (IsAVDDisplayPAL()? 24 : 12), ®ion[1],
OSD_FORMAT_4COLOR, OSD_NONINTERLACED);
#else
// setup region 2 //56:interlaced;80:non-interlaced
region[4].osd_w = 25 * 4; //30 * 4;//min 16*4 for vol control bar
region[4].osd_h = 8; //OSD_FONT_HEIGHT;
osd_create_region(®ion[4], 78, (IsAVDDisplayPAL()? 270 : 219), NULL,
OSD_FORMAT_4COLOR, OSD_NONINTERLACED);
// setup region 2 //56:interlaced;80:non-interlaced
region[3].osd_w = 25 * 4; //30 * 4;//min 16*4 for vol control bar
region[3].osd_h = 8; //OSD_FONT_HEIGHT;
osd_create_region(®ion[3], 78, (IsAVDDisplayPAL()? (180 + 3) : 147),
®ion[4], OSD_FORMAT_4COLOR, OSD_NONINTERLACED);
// setup region 3 //56:interlaced;80:non-interlaced
region[2].osd_w = 25 * 4; //30 * 4;//min 16*4 for vol control bar
region[2].osd_h = 8; //OSD_FONT_HEIGHT;
osd_create_region(®ion[2], 78, (IsAVDDisplayPAL()? (100 - 2) : 75),
®ion[3], OSD_FORMAT_4COLOR, OSD_NONINTERLACED);
// setup region 1 //40:interlaced;52:non-interlaced
region[1].osd_w = 14 * 4; //min 10*4 for vol control char
region[1].osd_h = OSD_FONT_HEIGHT;
osd_create_region(®ion[1], 32, (IsAVDDisplayPAL()? 52 : 48), ®ion[2],
OSD_FORMAT_4COLOR, OSD_NONINTERLACED);
// setup region 0 //24:interlaced/non-interlaced
region[0].osd_w = 8 * 4; //min 8*4 for time display//BYTE PER PIXEL
region[0].osd_h = OSD_FONT_HEIGHT; //PIXEL
osd_create_region(®ion[0], 32, (IsAVDDisplayPAL()? 24 : 20), ®ion[1],
OSD_FORMAT_4COLOR, OSD_NONINTERLACED);
#endif
#ifdef MONE_OSD_BUFFER
#if CONFIG==CONFIG_COMBO_SVCD
if((int)addr_vy(osd_free) >= (int)(MEM_AUDYA_DEF - MEM_OSDYA_DEF))
{
psprintf(linebuf, "OSD BUFFER OVERFLOW(osd_init_preview).... %x(%x)\n",
addr_vy(osd_free), (MEM_AUDYA_DEF - MEM_OSDYA_DEF));
epp_write_slow(linebuf);
}
#else
if((int)addr_vy(osd_free) >= (int)OBV_H)
{
psprintf(linebuf, "OSD BUFFER OVERFLOW(osd_init_preview).... %x(%x)\n",
addr_vy(osd_free), OBV_H);
epp_write_slow(linebuf);
}
#endif
#endif
ClearOsdMsg(0);
osd_enable();
}
//
// FUNCTION
// osd_init_prog
//
// DESCRIPTION
// initialize osd program menu
//
void osd_init_prog(void)
{
osd_disable();
// setup first free address
osd_free = addr_vxvy(0, 0);
//MAX creation
//region[0].osd_w = 14 * 4;
//region[0].osd_h = 6 * OSD_FONT_HEIGHT;
// setup region 7
region[7].osd_w = 10 * 4;
region[7].osd_h = OSD_FONT_HEIGHT;
osd_create_region(®ion[7], 110, 80 + (OSD_FONT_HEIGHT * 5), NULL,
OSD_FORMAT_4COLOR, OSD_NONINTERLACED);
// setup region 6
region[6].osd_w = 10 * 4;
region[6].osd_h = OSD_FONT_HEIGHT;
osd_create_region(®ion[6], 110, 80 + (OSD_FONT_HEIGHT * 4), ®ion[7],
OSD_FORMAT_4COLOR, OSD_NONINTERLACED);
// setup region 5
region[5].osd_w = 10 * 4;
region[5].osd_h = OSD_FONT_HEIGHT;
osd_create_region(®ion[5], 110, 80 + (OSD_FONT_HEIGHT * 3), ®ion[6],
OSD_FORMAT_4COLOR, OSD_NONINTERLACED);
// setup region 4
region[4].osd_w = 10 * 4;
region[4].osd_h = OSD_FONT_HEIGHT;
osd_create_region(®ion[4], 110, 80 + (OSD_FONT_HEIGHT * 2), ®ion[5],
OSD_FORMAT_4COLOR, OSD_NONINTERLACED);
// setup region 3
region[3].osd_w = 10 * 4;
region[3].osd_h = OSD_FONT_HEIGHT;
osd_create_region(®ion[3], 110, 80 + (OSD_FONT_HEIGHT * 1), ®ion[4],
OSD_FORMAT_4COLOR, OSD_NONINTERLACED);
// setup region 2
region[2].osd_w = 10 * 4;
region[2].osd_h = OSD_FONT_HEIGHT;
osd_create_region(®ion[2], 110, 80 + (OSD_FONT_HEIGHT * 0), ®ion[3],
OSD_FORMAT_4COLOR, OSD_NONINTERLACED);
// setup region 1 //40:interlaced;52:non-interlaced
region[1].osd_w = 14 * 4; //min 10*4 for vol control char
region[1].osd_h = OSD_FONT_HEIGHT;
osd_create_region(®ion[1], 32, 52, ®ion[2], OSD_FORMAT_4COLOR,
OSD_NONINTERLACED);
// setup region 0 //24:interlaced/non-interlaced
region[0].osd_w = 8 * 4; //min 8*4 for time display//BYTE PER PIXEL
region[0].osd_h = OSD_FONT_HEIGHT; //PIXEL
osd_create_region(®ion[0], 32, 24, ®ion[1], OSD_FORMAT_4COLOR,
OSD_NONINTERLACED);
#ifdef MONE_OSD_BUFFER
#if CONFIG==CONFIG_COMBO_SVCD
if((int)addr_vy(osd_free) >= (int)(MEM_AUDYA_DEF - MEM_OSDYA_DEF))
{
psprintf(linebuf, "OSD BUFFER OVERFLOW(osd_init_prog).... %x(%x)\n",
addr_vy(osd_free), (MEM_AUDYA_DEF - MEM_OSDYA_DEF));
epp_write_slow(linebuf);
}
#else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -