rockbox/apps/plugins/test_viewports.c

309 lines
7.5 KiB
C

/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id: helloworld.c 12807 2007-03-16 21:56:08Z amiconn $
*
* Copyright (C) 2007 Dave Chapman
*
* All files in this archive are subject to the GNU General Public License.
* See the file COPYING in the source tree root for full license agreement.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
****************************************************************************/
#include "plugin.h"
PLUGIN_HEADER
static struct plugin_api* rb;
#ifdef HAVE_LCD_BITMAP
#ifdef HAVE_LCD_COLOR
#define BGCOLOR_1 LCD_RGBPACK(255,255,0)
#define BGCOLOR_2 LCD_RGBPACK(0,255,0)
#define FGCOLOR_1 LCD_RGBPACK(0,0,255)
#else if LCD_DEPTH > 1
#define BGCOLOR_1 LCD_DARKGRAY
#define BGCOLOR_2 LCD_LIGHTGRAY
#define FGCOLOR_1 LCD_WHITE
#endif
static struct viewport vp0 =
{
.x = 0,
.y = 0,
.width = LCD_WIDTH,
.height = 20,
.font = FONT_UI,
.drawmode = DRMODE_SOLID,
.xmargin = 0,
.ymargin = 0,
#if LCD_DEPTH > 1
.fg_pattern = LCD_DEFAULT_FG,
.bg_pattern = BGCOLOR_1,
#endif
#ifdef HAVE_LCD_COLOR
.lss_pattern = LCD_DEFAULT_BG,
.lse_pattern = LCD_DEFAULT_BG,
.lst_pattern = LCD_DEFAULT_BG,
#endif
};
static struct viewport vp1 =
{
.x = LCD_WIDTH / 10,
.y = 20,
.width = LCD_WIDTH / 3,
.height = LCD_HEIGHT / 2,
.font = FONT_SYSFIXED,
.drawmode = DRMODE_SOLID,
.xmargin = 0,
.ymargin = 0,
#if LCD_DEPTH > 1
.fg_pattern = LCD_DEFAULT_FG,
.bg_pattern = LCD_DEFAULT_BG,
#ifdef HAVE_LCD_COLOR
.lss_pattern = LCD_DEFAULT_BG,
.lse_pattern = LCD_DEFAULT_BG,
.lst_pattern = LCD_DEFAULT_BG,
#endif
#endif
};
static struct viewport vp2 =
{
.x = LCD_WIDTH / 2,
.y = 40,
.width = LCD_WIDTH / 3,
.height = (LCD_HEIGHT / 2),
.font = FONT_UI,
.drawmode = DRMODE_SOLID,
.xmargin = 0,
.ymargin = 0,
#if LCD_DEPTH > 1
.fg_pattern = FGCOLOR_1,
.bg_pattern = BGCOLOR_2,
#ifdef HAVE_LCD_COLOR
.lss_pattern = LCD_DEFAULT_BG,
.lse_pattern = LCD_DEFAULT_BG,
.lst_pattern = LCD_DEFAULT_BG,
#endif
#endif
};
static struct viewport vp3 =
{
.x = LCD_WIDTH / 4,
.y = (5 * LCD_HEIGHT) / 8,
.width = LCD_WIDTH / 2,
.height = (LCD_HEIGHT / 4),
.font = FONT_SYSFIXED,
.drawmode = DRMODE_SOLID,
.xmargin = 0,
.ymargin = 0,
#if LCD_DEPTH > 1
.fg_pattern = LCD_BLACK,
.bg_pattern = LCD_WHITE,
#ifdef HAVE_LCD_COLOR
.lss_pattern = LCD_DEFAULT_BG,
.lse_pattern = LCD_DEFAULT_BG,
.lst_pattern = LCD_DEFAULT_BG,
#endif
#endif
};
#ifdef HAVE_REMOTE_LCD
static struct viewport rvp0 =
{
.x = 0,
.y = 10,
.width = LCD_REMOTE_WIDTH / 3,
.height = LCD_REMOTE_HEIGHT - 10,
.font = FONT_SYSFIXED,
.drawmode = DRMODE_SOLID,
.xmargin = 0,
.ymargin = 0,
#if LCD_REMOTE_DEPTH > 1
.fg_pattern = LCD_REMOTE_BLACK,
.bg_pattern = LCD_REMOTE_LIGHTGRAY,
#endif
};
static struct viewport rvp1 =
{
.x = LCD_REMOTE_WIDTH / 2,
.y = 0,
.width = LCD_REMOTE_WIDTH / 3,
.height = LCD_REMOTE_HEIGHT - 10,
.font = FONT_SYSFIXED,
.drawmode = DRMODE_SOLID,
.xmargin = 0,
.ymargin = 0,
#if LCD_REMOTE_DEPTH > 1
.fg_pattern = LCD_REMOTE_DEFAULT_FG,
.bg_pattern = LCD_REMOTE_DEFAULT_BG
#endif
};
#endif
enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
{
(void)parameter;
char buf[80];
int i,y;
rb = api;
rb->screens[SCREEN_MAIN]->set_viewport(&vp0);
rb->screens[SCREEN_MAIN]->clear_viewport();
rb->screens[SCREEN_MAIN]->puts_scroll(0,0,"Viewport testing plugin - this is a scrolling title");
rb->screens[SCREEN_MAIN]->set_viewport(&vp1);
rb->screens[SCREEN_MAIN]->clear_viewport();
for (i = 0 ; i < 3; i++)
{
rb->snprintf(buf,sizeof(buf),"Left text, scrolling_line %d",i);
rb->screens[SCREEN_MAIN]->puts_scroll(0,i,buf);
}
rb->screens[SCREEN_MAIN]->set_viewport(&vp2);
rb->screens[SCREEN_MAIN]->clear_viewport();
for (i = 1 ; i < 3; i++)
{
rb->snprintf(buf,sizeof(buf),"Right text, scrolling line %d",i);
rb->screens[SCREEN_MAIN]->puts_scroll(1,i,buf);
}
y = -10;
for (i = -10; i < vp2.width + 10; i += 5)
{
rb->screens[SCREEN_MAIN]->drawline(i, y, i, vp2.height - y);
}
rb->screens[SCREEN_MAIN]->set_viewport(&vp3);
rb->screens[SCREEN_MAIN]->clear_viewport();
for (i = 1 ; i < 2; i++)
{
rb->snprintf(buf,sizeof(buf),"Bottom text, a scrolling line %d",i);
rb->screens[SCREEN_MAIN]->puts_scroll(2,i,buf);
}
rb->screens[SCREEN_MAIN]->puts_scroll(4,i,"Short line");
rb->screens[SCREEN_MAIN]->update();
#ifdef HAVE_REMOTE_LCD
rb->screens[SCREEN_REMOTE]->set_viewport(&rvp0);
rb->screens[SCREEN_REMOTE]->clear_viewport();
for (i = 0 ; i < 5; i++)
{
rb->snprintf(buf,sizeof(buf),"Left text, scrolling_line %d",i);
rb->screens[SCREEN_REMOTE]->puts_scroll(0,i,buf);
}
rb->screens[SCREEN_REMOTE]->puts(1,i,"Static");
rb->screens[SCREEN_REMOTE]->set_viewport(&rvp1);
rb->screens[SCREEN_REMOTE]->clear_viewport();
for (i = 1 ; i < 3; i++)
{
rb->snprintf(buf,sizeof(buf),"Right text, scrolling line %d",i);
rb->screens[SCREEN_REMOTE]->puts_scroll(1,i,buf);
}
y = -10;
for (i = -10; i < rvp1.width + 10; i += 5)
{
rb->screens[SCREEN_REMOTE]->drawline(i, y, i, rvp1.height - y);
}
rb->screens[SCREEN_REMOTE]->update();
#endif
rb->button_get(true);
/* Restore the default viewport */
rb->screens[SCREEN_MAIN]->set_viewport(NULL);
#ifdef HAVE_REMOTE_LCD
rb->screens[SCREEN_REMOTE]->set_viewport(NULL);
#endif
return PLUGIN_OK;
}
#else
/* Charcell version of plugin */
static struct viewport vp0 =
{
.x = 0,
.y = 0,
.width = 5,
.height = 1,
.xmargin = 0,
.ymargin = 0,
};
static struct viewport vp1 =
{
.x = 6,
.y = 0,
.width = 5,
.height = 1,
.xmargin = 0,
.ymargin = 0,
};
static struct viewport vp2 =
{
.x = 0,
.y = 1,
.width = LCD_WIDTH,
.height = 1,
.xmargin = 0,
.ymargin = 0,
};
enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
{
(void)parameter;
rb = api;
rb->screens[SCREEN_MAIN]->set_viewport(&vp0);
rb->screens[SCREEN_MAIN]->clear_viewport();
rb->screens[SCREEN_MAIN]->puts_scroll(0,0,"Rockbox");
rb->screens[SCREEN_MAIN]->set_viewport(&vp1);
rb->screens[SCREEN_MAIN]->clear_viewport();
rb->screens[SCREEN_MAIN]->puts_scroll(0,0,"Viewports");
rb->screens[SCREEN_MAIN]->set_viewport(&vp2);
rb->screens[SCREEN_MAIN]->clear_viewport();
rb->screens[SCREEN_MAIN]->puts_scroll(0,0,"Demonstration");
rb->screens[SCREEN_MAIN]->update();
rb->button_get(true);
/* Restore the default viewport */
rb->screens[SCREEN_MAIN]->set_viewport(NULL);
return PLUGIN_OK;
}
#endif /* !HAVE_LCD_BITMAP */