summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--apps/plugin.c7
-rw-r--r--apps/plugin.h13
-rw-r--r--apps/plugins/CATEGORIES1
-rw-r--r--apps/plugins/test_viewports.c309
-rw-r--r--apps/screen_access.c20
-rw-r--r--apps/screen_access.h9
-rw-r--r--firmware/drivers/lcd-16bit.c5
-rw-r--r--firmware/drivers/lcd-1bit-vert.c5
-rw-r--r--firmware/drivers/lcd-2bit-horz.c5
-rw-r--r--firmware/drivers/lcd-2bit-vert.c5
-rw-r--r--firmware/drivers/lcd-remote-1bit-v.c5
-rw-r--r--firmware/drivers/lcd-remote-2bit-vi.c5
-rw-r--r--firmware/export/lcd-remote.h1
-rw-r--r--firmware/export/lcd.h1
14 files changed, 379 insertions, 12 deletions
diff --git a/apps/plugin.c b/apps/plugin.c
index 6d48329111..2149fdaee8 100644
--- a/apps/plugin.c
+++ b/apps/plugin.c
@@ -181,6 +181,9 @@ static const struct plugin_api rockbox_api = {
lcd_remote_bitmap,
#endif
+#if defined(HAVE_LCD_BITMAP) && (LCD_DEPTH < 4) && !defined(SIMULATOR)
+ lcd_grey_phase_blit,
+#endif
#if defined(HAVE_LCD_COLOR)
lcd_yuv_blit,
#endif
@@ -583,10 +586,6 @@ static const struct plugin_api rockbox_api = {
sound_unit,
sound_val2phys,
#endif /* CONFIG_CODEC == SWCODEC */
-
-#if defined(HAVE_LCD_BITMAP) && (LCD_DEPTH < 4) && !defined(SIMULATOR)
- lcd_grey_phase_blit,
-#endif
};
int plugin_load(const char* plugin, void* parameter)
diff --git a/apps/plugin.h b/apps/plugin.h
index f782b7a20c..849c10bb89 100644
--- a/apps/plugin.h
+++ b/apps/plugin.h
@@ -119,12 +119,12 @@
#define PLUGIN_MAGIC 0x526F634B /* RocK */
/* increase this every time the api struct changes */
-#define PLUGIN_API_VERSION 94
+#define PLUGIN_API_VERSION 95
/* update this to latest version if a change to the api struct breaks
backwards compatibility (and please take the opportunity to sort in any
new function which are "waiting" at the end of the function table) */
-#define PLUGIN_MIN_API_VERSION 88
+#define PLUGIN_MIN_API_VERSION 95
/* plugin return codes */
enum plugin_status {
@@ -267,6 +267,10 @@ struct plugin_api {
void (*lcd_remote_bitmap)(const fb_remote_data *src, int x, int y, int width,
int height);
#endif
+#if defined(HAVE_LCD_BITMAP) && (LCD_DEPTH < 4) && !defined(SIMULATOR)
+ void (*lcd_grey_phase_blit)(const struct grey_data *data, int bx, int by,
+ int bwidth, int bheight, int stride);
+#endif
#if defined(HAVE_LCD_COLOR)
void (*lcd_yuv_blit)(unsigned char * const src[3],
int src_x, int src_y, int stride,
@@ -718,11 +722,6 @@ struct plugin_api {
const char * (*sound_unit)(int setting);
int (*sound_val2phys)(int setting, int value);
#endif /* CONFIG_CODEC == SWCODEC */
-
-#if defined(HAVE_LCD_BITMAP) && (LCD_DEPTH < 4) && !defined(SIMULATOR)
- void (*lcd_grey_phase_blit)(const struct grey_data *data, int bx, int by,
- int bwidth, int bheight, int stride);
-#endif
};
/* plugin header */
diff --git a/apps/plugins/CATEGORIES b/apps/plugins/CATEGORIES
index 9a6cc93faa..ee28614da0 100644
--- a/apps/plugins/CATEGORIES
+++ b/apps/plugins/CATEGORIES
@@ -81,6 +81,7 @@ test_disk,apps
test_fps,apps
test_sampr,apps
test_scanrate,apps
+test_viewports,apps
text_editor,apps
vbrfix,viewers
video,viewers
diff --git a/apps/plugins/test_viewports.c b/apps/plugins/test_viewports.c
new file mode 100644
index 0000000000..3cb8afb519
--- /dev/null
+++ b/apps/plugins/test_viewports.c
@@ -0,0 +1,309 @@
+/***************************************************************************
+ * __________ __ ___.
+ * 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 */
diff --git a/apps/screen_access.c b/apps/screen_access.c
index 0d7017984e..5e9ab03d06 100644
--- a/apps/screen_access.c
+++ b/apps/screen_access.c
@@ -19,6 +19,7 @@
#include <lcd.h>
#include <lcd-remote.h>
+#include <scroll_engine.h>
#include "backlight.h"
#include <font.h>
#include <button.h>
@@ -50,12 +51,16 @@ struct screen screens[NB_SCREENS] =
#elif defined(HAVE_REMOTE_LCD)
.has_disk_led=true,
#endif
+ .set_viewport=&lcd_set_viewport,
.setmargins=&lcd_setmargins,
+ .getwidth=&lcd_getwidth,
+ .getheight=&lcd_getheight,
.getymargin=&lcd_getymargin,
.getxmargin=&lcd_getxmargin,
.getstringsize=&lcd_getstringsize,
#ifdef HAVE_LCD_BITMAP
.setfont=&lcd_setfont,
+ .getfont=&lcd_getfont,
.mono_bitmap=&lcd_mono_bitmap,
.mono_bitmap_part=&lcd_mono_bitmap_part,
.set_drawmode=&lcd_set_drawmode,
@@ -84,6 +89,7 @@ struct screen screens[NB_SCREENS] =
#endif
#endif /* LCD_DEPTH > 1 */
.update_rect=&lcd_update_rect,
+ .update_viewport_rect=&lcd_update_viewport_rect,
.fillrect=&lcd_fillrect,
.drawrect=&lcd_drawrect,
.drawpixel=&lcd_drawpixel,
@@ -114,7 +120,11 @@ struct screen screens[NB_SCREENS] =
.scroll_delay=&lcd_scroll_delay,
.stop_scroll=&lcd_stop_scroll,
.clear_display=&lcd_clear_display,
+ .clear_viewport=&lcd_clear_viewport,
+ .scroll_stop=&lcd_scroll_stop,
+ .scroll_stop_line=&lcd_scroll_stop_line,
.update=&lcd_update,
+ .update_viewport=&lcd_update_viewport,
.backlight_on=&backlight_on,
.backlight_off=&backlight_off,
.is_backlight_on=&is_backlight_on,
@@ -132,12 +142,15 @@ struct screen screens[NB_SCREENS] =
.is_color=false,/* No color remotes yet */
.pixel_format=LCD_REMOTE_PIXELFORMAT,
.has_disk_led=false,
+ .set_viewport=&lcd_remote_set_viewport,
.setmargins=&lcd_remote_setmargins,
+ .getwidth=&lcd_remote_getwidth,
+ .getheight=&lcd_remote_getheight,
.getymargin=&lcd_remote_getymargin,
.getxmargin=&lcd_remote_getxmargin,
.getstringsize=&lcd_remote_getstringsize,
#if 1 /* all remote LCDs are bitmapped so far */
- .setfont=&lcd_remote_setfont,
+ .getfont=&lcd_remote_getfont,
.mono_bitmap=&lcd_remote_mono_bitmap,
.mono_bitmap_part=&lcd_remote_mono_bitmap_part,
.bitmap=(screen_bitmap_func*)&lcd_remote_bitmap,
@@ -159,6 +172,7 @@ struct screen screens[NB_SCREENS] =
.set_foreground=&lcd_remote_set_foreground,
#endif /* LCD_REMOTE_DEPTH > 1 */
.update_rect=&lcd_remote_update_rect,
+ .update_viewport_rect=&lcd_remote_update_viewport_rect,
.fillrect=&lcd_remote_fillrect,
.drawrect=&lcd_remote_drawrect,
.drawpixel=&lcd_remote_drawpixel,
@@ -187,7 +201,11 @@ struct screen screens[NB_SCREENS] =
.scroll_delay=&lcd_remote_scroll_delay,
.stop_scroll=&lcd_remote_stop_scroll,
.clear_display=&lcd_remote_clear_display,
+ .clear_viewport=&lcd_remote_clear_viewport,
+ .scroll_stop=&lcd_remote_scroll_stop,
+ .scroll_stop_line=&lcd_remote_scroll_stop_line,
.update=&lcd_remote_update,
+ .update_viewport=&lcd_remote_update_viewport,
.backlight_on=&remote_backlight_on,
.backlight_off=&remote_backlight_off,
.is_backlight_on=&is_remote_backlight_on,
diff --git a/apps/screen_access.h b/apps/screen_access.h
index 35bcdef0a2..7efa48c423 100644
--- a/apps/screen_access.h
+++ b/apps/screen_access.h
@@ -71,12 +71,16 @@ struct screen
#ifdef HAS_BUTTONBAR
bool has_buttonbar;
#endif
+ void (*set_viewport)(struct viewport* vp);
void (*setmargins)(int x, int y);
+ int (*getwidth)(void);
+ int (*getheight)(void);
int (*getxmargin)(void);
int (*getymargin)(void);
int (*getstringsize)(const unsigned char *str, int *w, int *h);
#if defined(HAVE_LCD_BITMAP) || defined(HAVE_REMOTE_LCD) /* always bitmap */
void (*setfont)(int newfont);
+ int (*getfont)(void);
void (*scroll_step)(int pixels);
void (*puts_style_offset)(int x, int y, const unsigned char *str,
@@ -113,6 +117,7 @@ struct screen
void (*set_selector_text)(unsigned selector_text);
#endif
void (*update_rect)(int x, int y, int width, int height);
+ void (*update_viewport_rect)(int x, int y, int width, int height);
void (*fillrect)(int x, int y, int width, int height);
void (*drawrect)(int x, int y, int width, int height);
void (*drawpixel)(int x, int y);
@@ -139,7 +144,11 @@ struct screen
void (*scroll_delay)(int ms);
void (*stop_scroll)(void);
void (*clear_display)(void);
+ void (*clear_viewport)(void);
+ void (*scroll_stop)(struct viewport* vp);
+ void (*scroll_stop_line)(struct viewport* vp, int y);
void (*update)(void);
+ void (*update_viewport)(void);
void (*backlight_on)(void);
void (*backlight_off)(void);
bool (*is_backlight_on)(void);
diff --git a/firmware/drivers/lcd-16bit.c b/firmware/drivers/lcd-16bit.c
index cc5a6c5ab7..2a766d4006 100644
--- a/firmware/drivers/lcd-16bit.c
+++ b/firmware/drivers/lcd-16bit.c
@@ -190,6 +190,11 @@ void lcd_setfont(int newfont)
current_vp->font = newfont;
}
+int lcd_getfont(void)
+{
+ return current_vp->font;
+}
+
int lcd_getstringsize(const unsigned char *str, int *w, int *h)
{
return font_getstringsize(str, w, h, current_vp->font);
diff --git a/firmware/drivers/lcd-1bit-vert.c b/firmware/drivers/lcd-1bit-vert.c
index 5c651a9613..7c9cd26e2a 100644
--- a/firmware/drivers/lcd-1bit-vert.c
+++ b/firmware/drivers/lcd-1bit-vert.c
@@ -122,6 +122,11 @@ void lcd_setfont(int newfont)
current_vp->font = newfont;
}
+int lcd_getfont(void)
+{
+ return current_vp->font;
+}
+
int lcd_getstringsize(const unsigned char *str, int *w, int *h)
{
return font_getstringsize(str, w, h, current_vp->font);
diff --git a/firmware/drivers/lcd-2bit-horz.c b/firmware/drivers/lcd-2bit-horz.c
index 1ee0addba4..195885c072 100644
--- a/firmware/drivers/lcd-2bit-horz.c
+++ b/firmware/drivers/lcd-2bit-horz.c
@@ -172,6 +172,11 @@ void lcd_setfont(int newfont)
current_vp->font = newfont;
}
+int lcd_getfont(void)
+{
+ return current_vp->font;
+}
+
int lcd_getstringsize(const unsigned char *str, int *w, int *h)
{
return font_getstringsize(str, w, h, current_vp->font);
diff --git a/firmware/drivers/lcd-2bit-vert.c b/firmware/drivers/lcd-2bit-vert.c
index 2341ddb3df..cb532b7aaf 100644
--- a/firmware/drivers/lcd-2bit-vert.c
+++ b/firmware/drivers/lcd-2bit-vert.c
@@ -175,6 +175,11 @@ void lcd_setfont(int newfont)
current_vp->font = newfont;
}
+int lcd_getfont(void)
+{
+ return current_vp->font;
+}
+
int lcd_getstringsize(const unsigned char *str, int *w, int *h)
{
return font_getstringsize(str, w, h, current_vp->font);
diff --git a/firmware/drivers/lcd-remote-1bit-v.c b/firmware/drivers/lcd-remote-1bit-v.c
index a33648b76a..20c6f6655c 100644
--- a/firmware/drivers/lcd-remote-1bit-v.c
+++ b/firmware/drivers/lcd-remote-1bit-v.c
@@ -117,6 +117,11 @@ void lcd_remote_setfont(int newfont)
current_vp->font = newfont;
}
+int lcd_remote_getfont(void)
+{
+ return current_vp->font;
+}
+
int lcd_remote_getstringsize(const unsigned char *str, int *w, int *h)
{
return font_getstringsize(str, w, h, current_vp->font);
diff --git a/firmware/drivers/lcd-remote-2bit-vi.c b/firmware/drivers/lcd-remote-2bit-vi.c
index 9ab98c69aa..9f70e95195 100644
--- a/firmware/drivers/lcd-remote-2bit-vi.c
+++ b/firmware/drivers/lcd-remote-2bit-vi.c
@@ -174,6 +174,11 @@ void lcd_remote_setfont(int newfont)
current_vp->font = newfont;
}
+int lcd_remote_getfont(void)
+{
+ return current_vp->font;
+}
+
int lcd_remote_getstringsize(const unsigned char *str, int *w, int *h)
{
return font_getstringsize(str, w, h, current_vp->font);
diff --git a/firmware/export/lcd-remote.h b/firmware/export/lcd-remote.h
index 34c40e52c1..cdd48e5fa3 100644
--- a/firmware/export/lcd-remote.h
+++ b/firmware/export/lcd-remote.h
@@ -149,6 +149,7 @@ extern int lcd_remote_getymargin(void);
extern int lcd_remote_getwidth(void);
extern int lcd_remote_getheight(void);
extern void lcd_remote_setfont(int font);
+extern int lcd_remote_getfont(void);
extern int lcd_remote_getstringsize(const unsigned char *str, int *w, int *h);
/* low level drawing function pointer arrays */
diff --git a/firmware/export/lcd.h b/firmware/export/lcd.h
index 276dcdfedc..57c9b1d3b8 100644
--- a/firmware/export/lcd.h
+++ b/firmware/export/lcd.h
@@ -372,6 +372,7 @@ extern void lcd_set_flip(bool yesno);
extern void lcd_set_drawmode(int mode);
extern int lcd_get_drawmode(void);
extern void lcd_setfont(int font);
+extern int lcd_getfont(void);
extern void lcd_puts_style_offset(int x, int y, const unsigned char *str,
int style, int offset);