Index: rockbox/apps/gui/gwps-common.c
===================================================================
--- rockbox.orig/apps/gui/gwps-common.c
+++ rockbox/apps/gui/gwps-common.c
@@ -1566,6 +1566,42 @@ static void format_display(struct gui_wp
                 }
                 fmt += 8;
                 break;
+            case 'e': /* Line settings (x/y/width and font face */
+        	fmt++;
+        	if (*fmt == '|') {
+        	    char *p=strchr(fmt, '|');
+        	    if (p) {
+        		fmt = ++p;
+        		gwps->data->line_xpos = atoi(p);
+        		p = strchr(p, '|');
+        		if (p) {
+        		    fmt = ++p;
+        		    gwps->data->line_ypos = atoi(p);
+        		    p = strchr(p, '|');
+        		    if (p) {
+        			fmt = ++p;
+        			gwps->data->line_width = atoi(p);
+        			p = strchr(p, '|');
+        			if (p) {
+        			    fmt = ++p;
+        			    gwps->data->line_font = atoi(p);
+        			    p = strchr(p, '|');
+        			    if (p) {
+        				fmt = ++p;
+        				char fg_color[7];
+        				snprintf(fg_color, 7, "%s", p);
+        				gwps->data->line_fgcolor = hex_to_rgb(fg_color);
+        				p = strchr(p, '|');
+        				if (p) {
+        				    fmt = ++p;
+        				}
+        			    }
+        			}
+        		    }
+        		}
+        	    }
+        	}
+        	break;
             case 'a':
                 ++fmt;
                 /* remember where the current aligned text started */
@@ -2202,6 +2238,46 @@ bool gui_wps_refresh(struct gui_wps *gwp
             }
 #endif
 #ifdef HAVE_LCD_BITMAP
+	    /* If need to refresh a line and we have a custom font we
+	       should set the font face prior getting the font size */
+            if (flags & (WPS_REFRESH_DYNAMIC | WPS_REFRESH_STATIC))
+            {
+        	if (((refresh_mode & (WPS_REFRESH_DYNAMIC|WPS_REFRESH_STATIC)) ||
+        	    new_subline_refresh) && 
+        	    ((int)data->line_xpos || (int)data->line_ypos ||
+        	     (int)data->line_width || (int)data->line_font))
+        	{
+        	    if (data->line_font_prev != data->line_font) {
+        		switch (data->line_font) 
+        		{
+        		    case 1:
+        			display->setfont(FONT_USER1);
+        			break;
+        		    case 2:
+        			display->setfont(FONT_USER2);
+        			break;
+        		    case 3:
+        			display->setfont(FONT_USER3);
+        			break;
+        		    case 4:
+        			display->setfont(FONT_USER4);
+        			break;
+        		    case 5:
+        			display->setfont(FONT_USER5);
+        			break;
+        		    case 6:
+        			display->setfont(FONT_USER6);
+        			break;
+//        		    case 7:
+//        			display->setfont(FONT_USER7);
+        			break;
+        		}
+        		
+        		data->line_font_prev = data->line_font;
+        	    }
+        	}
+    	    }
+        	    
             /* calculate different string sizes and positions */
             display->getstringsize((unsigned char *)" ", &space_width, &string_height);
             if (data->format_align[i][data->curr_subline[i]].left != 0) {
@@ -2376,8 +2452,59 @@ bool gui_wps_refresh(struct gui_wps *gwp
 #endif
                 }
             }
+            /* Custom lines with x/y/width coordinates and font face/color */
             else if (flags & (WPS_REFRESH_DYNAMIC | WPS_REFRESH_STATIC))
             {
+        	if (((refresh_mode & (WPS_REFRESH_DYNAMIC|WPS_REFRESH_STATIC)) ||
+        	    new_subline_refresh) && 
+        	    ((int)data->line_xpos || (int)data->line_ypos ||
+        	     (int)data->line_width || (int)data->line_font))
+        	{
+        	    update_line = true;
+        	    
+        	    /* Clear the area first */
+        	    display->set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID);
+        	    display->fillrect((int)data->line_xpos,
+        			      (int)data->line_ypos,
+        			      (int)data->line_width,
+        			      string_height);
+        	    display->set_drawmode(DRMODE_SOLID);
+        	    
+        	    if (data->line_fgcolor_prev != data->line_fgcolor) {
+#if LCD_DEPTH > 1
+					lcd_set_foreground(data->line_fgcolor);
+#endif	        		
+    	    		data->line_fgcolor_prev = data->line_fgcolor;
+        	    }
+        	    
+        	    display->setmargins(data->line_xpos, data->line_xpos+data->line_width, data->line_ypos);
+        	    display->set_custom_width(data->line_width);
+        	    
+        	    /* Print aligned strings */
+        	    if (left_width != 0) 
+        	    {
+        			display->putsxy((int)data->line_xpos,
+        				(int)data->line_ypos,
+        				(unsigned char *)data->format_align[i]
+        				[data->curr_subline[i]].left);
+        	    }
+        	    if (center_width != 0) 
+        	    {
+        			display->putsxy((int)data->line_xpos+
+        					(int)((data->line_width-center_width)/2),
+        				(int)data->line_ypos,
+        				(unsigned char *)data->format_align[i]
+        				[data->curr_subline[i]].center);
+        	    }
+        	    if (right_width != 0) 
+        	    {
+        			display->putsxy((int)data->line_xpos+
+        				    ((int)data->line_width-right_width),
+        				(int)data->line_ypos,
+        				(unsigned char *)data->format_align[i]
+        				[data->curr_subline[i]].right);
+        	    }
+         	} else
                 /* dynamic / static line */
                 if ((refresh_mode & (WPS_REFRESH_DYNAMIC|WPS_REFRESH_STATIC)) ||
                     new_subline_refresh)
@@ -2442,6 +2569,19 @@ bool gui_wps_refresh(struct gui_wps *gwp
     /* Now we know wether the peak meter is used.
        So we can enable / disable the peak meter thread */
     data->peak_meter_enabled = enable_pm;
+    
+    /* MWE Reset margins */
+    data->line_xpos=0;
+    data->line_ypos=0;
+    data->line_width=0;
+    data->line_font=0;
+    
+    /* Reset display color */
+    data->line_fgcolor_prev = 0;
+    data->line_fgcolor = global_settings.fg_color;
+#if LCD_DEPTH > 1
+	lcd_set_foreground(global_settings.fg_color);
+#endif
 #endif
 
 #ifdef CONFIG_BACKLIGHT
@@ -2643,6 +2783,58 @@ static void draw_player_fullbar(struct g
                 if (j<(songpos%5)) {
                     binline[i*5+j] = 1;
                 }
+
+                /* scroll line */
+                if ((refresh_mode & WPS_REFRESH_SCROLL) ||
+                    new_subline_refresh) {
+#ifdef HAVE_LCD_BITMAP
+                    ypos = (i*string_height)+display->getymargin();
+                    update_line = true;
+
+                    if ((left_width > display->width) || 
+                       (display->getrightmargin()-display->getleftmargin() < left_width) ||
+                       (display->getrightmargin()-display->getleftmargin() < center_width) ||
+                       (display->getrightmargin()-display->getleftmargin() < right_width)) {
+                        display->puts_scroll(0, i,
+                                             (unsigned char *)data->format_align[i]
+                                             [data->curr_subline[i]].left);
+                    } else {
+                        /* clear the line first */
+                        display->set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID);
+                        display->fillrect(0, ypos, display->width, string_height);
+                        display->set_drawmode(DRMODE_SOLID);
+
+                        /* Nasty hack: we output an empty scrolling string,
+                           which will reset the scroller for that line */
+                        display->puts_scroll(0, i, (unsigned char *)"");
+                        
+                        /* print aligned strings */
+                        if (left_width != 0)
+                        {
+                            display->putsxy(left_xpos, ypos,
+                                            (unsigned char *)data->format_align[i]
+                                            [data->curr_subline[i]].left);
+                        }
+                        if (center_width != 0)
+                        {
+                            display->putsxy(center_xpos, ypos, 
+                                            (unsigned char *)data->format_align[i]
+                                            [data->curr_subline[i]].center);
+                        }
+                        if (right_width != 0)
+                        {
+                            display->putsxy(right_xpos, ypos,
+                                            (unsigned char *)data->format_align[i]
+                                            [data->curr_subline[i]].right);
+                        }
+                        
+                    }
+#else
+                    display->puts_scroll(0, i, buf);
+                    update_line = true;
+#endif
+                }
+            
             }
         }
 
Index: rockbox/apps/gui/gwps.h
===================================================================
--- rockbox.orig/apps/gui/gwps.h
+++ rockbox/apps/gui/gwps.h
@@ -398,6 +398,9 @@ struct wps_data
     int progress_y; /* if 0, progress bars use up a line as before */
     bool wps_loaded;
     bool peak_meter_enabled;
+    int line_xpos, line_ypos, line_width;
+    int line_font, line_font_prev;
+    int line_fgcolor, line_fgcolor_prev;
 };
 
 /* initial setup of wps_data */
