1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 * Copyright (C) 2010 Yoshihisa Uchida
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
20 ****************************************************************************/
21 #include "tv_display.h"
22 #include "tv_preferences.h"
27 * when is defined HAVE_LCD_BITMAP
28 * +-------------------------+
30 * +-------------------------+
32 * +---+---------------------+
43 * +---+---------------------+
45 * +---+---------------------+
47 * +-------------------------+
49 * +-------------------------+
51 * (1) displays when rb->global_settings->statusbar == STATUSBAR_TOP.
52 * (2) displays when preferences->header_mode is HD_PATH.
53 * (3) displays when preferences->vertical_scrollbar is SB_ON.
54 * (4) displays when preferences->horizontal_scrollbar is SB_ON.
55 * (5) displays when preferences->footer_mode is FT_PAGE.
56 * (6) displays when rb->global_settings->statusbar == STATUSBAR_BOTTOM.
59 * when isn't defined HAVE_LCD_BITMAP
60 * +---+---------------------+
64 * +---+---------------------+
68 #define TV_SCROLLBAR_WIDTH rb->global_settings->scrollbar_width
69 #define TV_SCROLLBAR_HEIGHT 4
71 #ifndef HAVE_LCD_BITMAP
72 #define TV_BOOKMARK_ICON 0xe101
82 static struct viewport vp_info
;
83 static bool is_initialized_vp
= false;
85 #ifdef HAVE_LCD_BITMAP
86 static int drawmode
= DRMODE_SOLID
;
88 static bool show_vertical_scrollbar
;
91 static struct screen
* display
;
94 #ifdef HAVE_LCD_BITMAP
95 static struct tv_rect header
;
96 static struct tv_rect footer
;
97 static struct tv_rect horizontal_scrollbar
;
98 static struct tv_rect vertical_scrollbar
;
100 static struct tv_rect bookmark
;
102 static struct tv_rect drawarea
;
104 static int display_columns
;
105 static int display_rows
;
107 static int col_width
;
108 static int row_height
;
110 #ifdef HAVE_LCD_BITMAP
112 void tv_show_header(void)
114 unsigned header_mode
= header_mode
;
116 if (preferences
->header_mode
== HD_PATH
)
117 display
->putsxy(header
.x
, header
.y
, preferences
->file_name
);
120 void tv_show_footer(const struct tv_screen_pos
*pos
)
122 unsigned char buf
[12];
123 unsigned footer_mode
= preferences
->footer_mode
;
125 if (footer_mode
== FT_PAGE
)
128 rb
->snprintf(buf
, sizeof(buf
), "%d", pos
->page
+ 1);
130 rb
->snprintf(buf
, sizeof(buf
), "%d - %d", pos
->page
+ 1, pos
->page
+ 2);
131 display
->putsxy(footer
.x
, footer
.y
+ 1, buf
);
135 void tv_init_scrollbar(off_t total
, bool show_scrollbar
)
138 show_vertical_scrollbar
= show_scrollbar
;
141 void tv_show_scrollbar(int window
, int col
, off_t cur_pos
, int size
)
147 if (preferences
->horizontal_scrollbar
)
149 items
= preferences
->windows
* display_columns
;
150 min_shown
= window
* display_columns
+ col
;
151 max_shown
= min_shown
+ display_columns
;
153 rb
->gui_scrollbar_draw(display
,
154 horizontal_scrollbar
.x
, horizontal_scrollbar
.y
+ 1,
155 horizontal_scrollbar
.w
, TV_SCROLLBAR_HEIGHT
,
156 items
, min_shown
, max_shown
, HORIZONTAL
);
159 if (show_vertical_scrollbar
)
161 items
= (int) totalsize
;
162 min_shown
= (int) cur_pos
;
163 max_shown
= min_shown
+ size
;
165 rb
->gui_scrollbar_draw(display
,
166 vertical_scrollbar
.x
, vertical_scrollbar
.y
,
167 TV_SCROLLBAR_WIDTH
, vertical_scrollbar
.h
,
168 items
, min_shown
, max_shown
, VERTICAL
);
172 void tv_fillrect(int col
, int row
, int rows
)
174 display
->fillrect(drawarea
.x
+ col
* col_width
, drawarea
.y
+ row
* row_height
,
175 drawarea
.w
- col
* col_width
, rows
* row_height
);
178 void tv_set_drawmode(int mode
)
180 rb
->lcd_set_drawmode(mode
);
185 void tv_draw_text(int row
, const unsigned char *text
, int offset
)
187 int xpos
= -offset
* col_width
;
190 if (row
< 0 || row
>= display_rows
)
193 if (preferences
->alignment
== AL_RIGHT
)
195 display
->getstringsize(text
, &text_width
, NULL
);
196 xpos
+= ((offset
> 0)? drawarea
.w
* 2 : drawarea
.w
) - text_width
;
199 #ifdef HAVE_LCD_BITMAP
200 display
->putsxy(drawarea
.x
+ xpos
, drawarea
.y
+ row
* row_height
, text
);
202 display
->puts(drawarea
.x
+ xpos
, drawarea
.y
+ row
, text
);
206 #ifndef HAVE_LCD_BITMAP
207 void tv_put_bookmark_icon(int row
)
209 display
->putchar(bookmark
.x
, drawarea
.y
+ row
, TV_BOOKMARK_ICON
);
213 void tv_init_display(void)
215 display
= rb
->screens
[SCREEN_MAIN
];
216 display
->clear_viewport();
219 void tv_start_display(void)
221 display
->set_viewport(&vp_info
);
222 #ifdef HAVE_LCD_BITMAP
223 drawmode
= rb
->lcd_get_drawmode();
227 void tv_end_display(void)
229 #ifdef HAVE_LCD_BITMAP
230 rb
->lcd_set_drawmode(drawmode
);
232 display
->set_viewport(NULL
);
235 void tv_clear_display(void)
238 rb
->lcd_set_backdrop(NULL
);
240 display
->clear_viewport();
243 void tv_update_display(void)
245 display
->update_viewport();
248 #ifdef HAVE_LCD_BITMAP
249 void tv_set_layout(int col_w
, bool show_scrollbar
)
251 void tv_set_layout(int col_w
)
254 #ifdef HAVE_LCD_BITMAP
255 int scrollbar_width
= (show_scrollbar
)? TV_SCROLLBAR_WIDTH
+ 1 : 0;
256 int scrollbar_height
= (preferences
->horizontal_scrollbar
)? TV_SCROLLBAR_HEIGHT
+ 1 : 0;
258 row_height
= preferences
->font
->height
;
262 header
.w
= vp_info
.width
;
263 header
.h
= (preferences
->header_mode
== HD_PATH
)? row_height
+ 1 : 0;
266 footer
.w
= vp_info
.width
;
267 footer
.h
= (preferences
->footer_mode
== FT_PAGE
)? row_height
+ 1 : 0;
268 footer
.y
= vp_info
.height
- 1 - footer
.h
;
270 drawarea
.x
= scrollbar_width
;
271 drawarea
.y
= header
.y
+ header
.h
;
272 drawarea
.w
= vp_info
.width
- scrollbar_width
;
273 drawarea
.h
= footer
.y
- drawarea
.y
- scrollbar_height
;
275 horizontal_scrollbar
.x
= drawarea
.x
;
276 horizontal_scrollbar
.y
= footer
.y
- scrollbar_height
;
277 horizontal_scrollbar
.w
= drawarea
.w
;
278 horizontal_scrollbar
.h
= scrollbar_height
;
280 vertical_scrollbar
.x
= 0;
281 vertical_scrollbar
.y
= drawarea
.y
;
282 vertical_scrollbar
.w
= scrollbar_width
;
283 vertical_scrollbar
.h
= drawarea
.h
;
290 bookmark
.h
= vp_info
.height
;
294 drawarea
.w
= vp_info
.width
- 1;
295 drawarea
.h
= vp_info
.height
;
299 display_columns
= drawarea
.w
/ col_width
;
300 display_rows
= drawarea
.h
/ row_height
;
303 void tv_get_drawarea_info(int *width
, int *cols
, int *rows
)
306 *cols
= display_columns
;
307 *rows
= display_rows
;
310 void tv_change_viewport(void)
312 #ifdef HAVE_LCD_BITMAP
315 if (is_initialized_vp
)
318 is_initialized_vp
= true;
320 rb
->viewportmanager_theme_enable(SCREEN_MAIN
, preferences
->statusbar
, &vp
);
322 vp_info
.flags
&= ~VP_FLAG_ALIGNMENT_MASK
;
325 if (!is_initialized_vp
)
327 rb
->viewport_set_defaults(&vp_info
, SCREEN_MAIN
);
328 is_initialized_vp
= true;
333 void tv_undo_viewport(void)
335 #ifdef HAVE_LCD_BITMAP
336 if (is_initialized_vp
)
337 rb
->viewportmanager_theme_undo(SCREEN_MAIN
, false);