diff --git a/apps/gui/icon.c b/apps/gui/icon.c index 6a5ff708d1..74af4a0d90 100644 --- a/apps/gui/icon.c +++ b/apps/gui/icon.c @@ -124,6 +124,7 @@ void screen_put_iconxy(struct screen * display, int screen = display->screen_type; int width = ICON_WIDTH(screen); int height = ICON_HEIGHT(screen); + int stride; screen_bitmap_part_func *draw_func = NULL; if (icon == Icon_NOICON) @@ -142,15 +143,20 @@ void screen_put_iconxy(struct screen * display, screen_put_iconxy(display, xpos, ypos, Icon_Questionmark); return; } - data = viewer_iconset[screen].data; + data = viewer_iconset[screen].data; + stride = STRIDE( viewer_iconset[screen].width, + viewer_iconset[screen].height); } else if (custom_icons_loaded[screen]) { - data = user_iconset[screen].data; + data = user_iconset[screen].data; + stride = STRIDE( user_iconset[screen].width, + user_iconset[screen].height); } else { - data = inbuilt_icons[screen]; + data = inbuilt_icons[screen]; + stride = STRIDE(BMPWIDTH_default_icons, BMPHEIGHT_default_icons); } /* add some left padding to the icons if they are on the edge */ if (xpos == 0) @@ -158,12 +164,12 @@ void screen_put_iconxy(struct screen * display, #if (LCD_DEPTH == 16) || defined(LCD_REMOTE_DEPTH) && (LCD_REMOTE_DEPTH == 16) if (display->depth == 16) - draw_func = display->transparent_bitmap_part; + draw_func = display->transparent_bitmap_part; else #endif - draw_func = display->bitmap_part; + draw_func = display->bitmap_part; - draw_func(data, 0, height * icon, width, xpos, ypos, width, height); + draw_func(data, 0, height * icon, stride, xpos, ypos, width, height); } void screen_put_cursorxy(struct screen * display, int x, int y, bool on) diff --git a/apps/gui/scrollbar.c b/apps/gui/scrollbar.c index 0f2a485b32..193bb4b65a 100644 --- a/apps/gui/scrollbar.c +++ b/apps/gui/scrollbar.c @@ -202,7 +202,8 @@ void gui_bitmap_scrollbar_draw(struct screen * screen, struct bitmap bm, int x, #if LCD_DEPTH > 1 else screen->transparent_bitmap_part((fb_data *)bm.data, 0, 0, - bm.width, x + start, y, size, height); + STRIDE(bm.width, bm.height), + x + start, y, size, height); #endif } else { #if LCD_DEPTH > 1 @@ -213,7 +214,8 @@ void gui_bitmap_scrollbar_draw(struct screen * screen, struct bitmap bm, int x, #if LCD_DEPTH > 1 else screen->transparent_bitmap_part((fb_data *)bm.data, 0, 0, - bm.width, x, y + start, width, size); + STRIDE(bm.width, bm.height), + x, y + start, width, size); #endif } } diff --git a/apps/gui/skin_engine/skin_display.c b/apps/gui/skin_engine/skin_display.c index a6cab63829..409984494c 100644 --- a/apps/gui/skin_engine/skin_display.c +++ b/apps/gui/skin_engine/skin_display.c @@ -232,8 +232,8 @@ static void wps_draw_image(struct gui_wps *gwps, struct gui_img *img, int subima } else { display->transparent_bitmap_part((fb_data *)img->bm.data, 0, img->subimage_height * subimage, - img->bm.width, img->x, - img->y, img->bm.width, + STRIDE(img->bm.width, img->bm.height), + img->x, img->y, img->bm.width, img->subimage_height); } #endif diff --git a/firmware/export/config.h b/firmware/export/config.h index 18dca402fb..13d272f7b7 100644 --- a/firmware/export/config.h +++ b/firmware/export/config.h @@ -206,6 +206,10 @@ #define RGB565 565 #define RGB565SWAPPED 3553 +/* LCD_STRIDEFORMAT */ +#define VERTICAL_STRIDE 1 +#define HORIZONTAL_STRIDE 2 + /* CONFIG_ORIENTATION */ #define SCREEN_PORTRAIT 0 #define SCREEN_LANDSCAPE 1 diff --git a/firmware/export/lcd.h b/firmware/export/lcd.h index 5846fae9c1..3d391d6685 100644 --- a/firmware/export/lcd.h +++ b/firmware/export/lcd.h @@ -306,6 +306,13 @@ static inline unsigned lcd_color_to_native(unsigned color) #endif /* HAVE_LCD_COLOR */ +/* Frame buffer stride */ +#if defined(LCD_STRIDEFORMAT) && LCD_STRIDEFORMAT == VERTICAL_STRIDE +#define STRIDE(w, h) (h) +#else +#define STRIDE(w, h) (w) +#endif + /* Frame buffer dimensions */ #if LCD_DEPTH == 1 #if LCD_PIXELFORMAT == HORIZONTAL_PACKING