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 * and preferences->header_mode is HD_SBAR or HD_BOTH.
53 * (2) displays when preferences->header_mode is HD_PATH or HD_BOTH.
54 * (3) displays when preferences->vertical_scrollbar is SB_ON.
55 * (4) displays when preferences->horizontal_scrollbar is SB_ON.
56 * (5) displays when preferences->footer_mode is FT_PAGE or FT_BOTH.
57 * (6) displays when rb->global_settings->statusbar == STATUSBAR_BOTTOM
58 * and preferences->footer_mode is FT_SBAR or FT_BOTH.
61 * when isn't defined HAVE_LCD_BITMAP
62 * +---+---------------------+
66 * +---+---------------------+
70 #define TV_SCROLLBAR_WIDTH rb->global_settings->scrollbar_width
71 #define TV_SCROLLBAR_HEIGHT 4
73 #ifndef HAVE_LCD_BITMAP
74 #define TV_BOOKMARK_ICON 0xe101
84 static struct viewport vp_info
;
85 static bool is_initialized_vp
= false;
87 #ifdef HAVE_LCD_BITMAP
88 static int drawmode
= DRMODE_SOLID
;
90 static bool show_vertical_scrollbar
;
93 static struct screen
* display
;
96 #ifdef HAVE_LCD_BITMAP
97 static struct tv_rect header
;
98 static struct tv_rect footer
;
99 static struct tv_rect horizontal_scrollbar
;
100 static struct tv_rect vertical_scrollbar
;
102 static struct tv_rect bookmark
;
104 static struct tv_rect drawarea
;
106 static int display_columns
;
107 static int display_rows
;
109 static int col_width
;
110 static int row_height
;
112 #ifdef HAVE_LCD_BITMAP
114 void tv_show_header(void)
116 unsigned header_mode
= header_mode
;
118 if (preferences
->header_mode
== HD_PATH
|| preferences
->header_mode
== HD_BOTH
)
119 display
->putsxy(header
.x
, header
.y
, preferences
->file_name
);
122 void tv_show_footer(const struct tv_screen_pos
*pos
)
124 unsigned char buf
[12];
125 unsigned footer_mode
= preferences
->footer_mode
;
127 if (footer_mode
== FT_PAGE
|| footer_mode
== FT_BOTH
)
130 rb
->snprintf(buf
, sizeof(buf
), "%d", pos
->page
+ 1);
132 rb
->snprintf(buf
, sizeof(buf
), "%d - %d", pos
->page
+ 1, pos
->page
+ 2);
133 display
->putsxy(footer
.x
, footer
.y
, buf
);
137 void tv_init_scrollbar(off_t total
, bool show_scrollbar
)
140 show_vertical_scrollbar
= show_scrollbar
;
143 void tv_show_scrollbar(int window
, int col
, off_t cur_pos
, int size
)
149 if (preferences
->horizontal_scrollbar
)
151 items
= preferences
->windows
* display_columns
;
152 min_shown
= window
* display_columns
+ col
;
153 max_shown
= min_shown
+ display_columns
;
155 rb
->gui_scrollbar_draw(display
,
156 horizontal_scrollbar
.x
, horizontal_scrollbar
.y
,
157 horizontal_scrollbar
.w
, TV_SCROLLBAR_HEIGHT
,
158 items
, min_shown
, max_shown
, HORIZONTAL
);
161 if (show_vertical_scrollbar
)
163 items
= (int) totalsize
;
164 min_shown
= (int) cur_pos
;
165 max_shown
= min_shown
+ size
;
167 rb
->gui_scrollbar_draw(display
,
168 vertical_scrollbar
.x
, vertical_scrollbar
.y
,
169 TV_SCROLLBAR_WIDTH
-1, vertical_scrollbar
.h
,
170 items
, min_shown
, max_shown
, VERTICAL
);
174 void tv_fillrect(int col
, int row
, int rows
)
176 display
->fillrect(drawarea
.x
+ col
* col_width
, drawarea
.y
+ row
* row_height
,
177 drawarea
.w
- col
* col_width
, rows
* row_height
);
180 void tv_set_drawmode(int mode
)
182 rb
->lcd_set_drawmode(mode
);
187 void tv_draw_text(int row
, const unsigned char *text
, int offset
)
189 int xpos
= -offset
* col_width
;
192 if (row
< 0 || row
>= display_rows
)
195 if (preferences
->alignment
== AL_RIGHT
)
197 display
->getstringsize(text
, &text_width
, NULL
);
198 xpos
+= ((offset
> 0)? drawarea
.w
* 2 : drawarea
.w
) - text_width
;
201 #ifdef HAVE_LCD_BITMAP
202 display
->putsxy(drawarea
.x
+ xpos
, drawarea
.y
+ row
* row_height
, text
);
204 display
->puts(drawarea
.x
+ xpos
, drawarea
.y
+ row
, text
);
208 #ifndef HAVE_LCD_BITMAP
209 void tv_put_bookmark_icon(int row
)
211 display
->putchar(bookmark
.x
, drawarea
.y
+ row
, TV_BOOKMARK_ICON
);
215 void tv_init_display(void)
217 display
= rb
->screens
[SCREEN_MAIN
];
218 display
->clear_viewport();
221 void tv_start_display(void)
223 display
->set_viewport(&vp_info
);
224 #ifdef HAVE_LCD_BITMAP
225 drawmode
= rb
->lcd_get_drawmode();
229 void tv_end_display(void)
231 #ifdef HAVE_LCD_BITMAP
232 rb
->lcd_set_drawmode(drawmode
);
234 display
->set_viewport(NULL
);
237 void tv_clear_display(void)
239 display
->clear_viewport();
242 void tv_update_display(void)
244 display
->update_viewport();
247 #ifdef HAVE_LCD_BITMAP
248 void tv_set_layout(int col_w
, bool show_scrollbar
)
250 void tv_set_layout(int col_w
)
253 #ifdef HAVE_LCD_BITMAP
254 int scrollbar_width
= (show_scrollbar
)? TV_SCROLLBAR_WIDTH
: 0;
255 int scrollbar_height
= (preferences
->horizontal_scrollbar
)? TV_SCROLLBAR_HEIGHT
: 0;
256 unsigned header_mode
= preferences
->header_mode
;
257 unsigned footer_mode
= preferences
->footer_mode
;
259 row_height
= preferences
->font
->height
;
263 header
.w
= vp_info
.width
;
264 header
.h
= (header_mode
== HD_PATH
|| header_mode
== HD_BOTH
)? row_height
: 0;
267 footer
.w
= vp_info
.width
;
268 footer
.h
= (footer_mode
== FT_PAGE
|| footer_mode
== FT_BOTH
)? row_height
: 0;
269 footer
.y
= vp_info
.height
- footer
.h
;
271 drawarea
.x
= scrollbar_width
;
272 drawarea
.y
= header
.y
+ header
.h
;
273 drawarea
.w
= vp_info
.width
- scrollbar_width
;
274 drawarea
.h
= footer
.y
- drawarea
.y
- scrollbar_height
;
276 horizontal_scrollbar
.x
= drawarea
.x
;
277 horizontal_scrollbar
.y
= footer
.y
- scrollbar_height
;
278 horizontal_scrollbar
.w
= drawarea
.w
;
279 horizontal_scrollbar
.h
= scrollbar_height
;
281 vertical_scrollbar
.x
= 0;
282 vertical_scrollbar
.y
= drawarea
.y
;
283 vertical_scrollbar
.w
= scrollbar_width
;
284 vertical_scrollbar
.h
= drawarea
.h
;
291 bookmark
.h
= vp_info
.height
;
295 drawarea
.w
= vp_info
.width
- 1;
296 drawarea
.h
= vp_info
.height
;
300 display_columns
= drawarea
.w
/ col_width
;
301 display_rows
= drawarea
.h
/ row_height
;
304 void tv_get_drawarea_info(int *width
, int *cols
, int *rows
)
307 *cols
= display_columns
;
308 *rows
= display_rows
;
311 void tv_change_viewport(void)
313 #ifdef HAVE_LCD_BITMAP
315 bool show_statusbar
= (preferences
->header_mode
== HD_SBAR
||
316 preferences
->header_mode
== HD_BOTH
||
317 preferences
->footer_mode
== FT_SBAR
||
318 preferences
->footer_mode
== FT_BOTH
);
320 if (is_initialized_vp
)
323 is_initialized_vp
= true;
325 rb
->viewportmanager_theme_enable(SCREEN_MAIN
, show_statusbar
, &vp
);
327 vp_info
.flags
&= ~VP_FLAG_ALIGNMENT_MASK
;
330 if (!is_initialized_vp
)
332 rb
->viewport_set_defaults(&vp_info
, SCREEN_MAIN
);
333 is_initialized_vp
= true;
338 void tv_undo_viewport(void)
340 #ifdef HAVE_LCD_BITMAP
341 if (is_initialized_vp
)
342 rb
->viewportmanager_theme_undo(SCREEN_MAIN
, false);