rockbox/apps/gui/line.h
Thomas Martitz 7ba2d0160b put_line(): Limit and truncate inline strings to MAX_PATH+32.
Because inline strings have to be copied (to escape '$') the local buffer
can be exhaused. The code didn't check for this. The buffer is increased
to handle filenames plus some extra chars but truncates to avoid overflow.

If you have longer strings please pass them via $t tag, in which case
put_line() imposes no additional length-limitation.

Change-Id: I0ca20adbe72f6d44cb442f34d665c16b12cbbaeb
2014-01-09 23:17:38 +01:00

144 lines
6.2 KiB
C

/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id$
*
* Copyright (C) 2013 Thomas Martitz
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
****************************************************************************/
#ifndef __LINE_H__
#define __LINE_H__
#include <stdint.h>
#include <stdbool.h>
#include <stdarg.h>
#include "lcd.h"
#include "screens.h"
/* Possible line decoration styles. Specify one of
* STYLE_NONE, _DEFAULT, _INVERT, _COLORBAR or _GRADIENT, and optionally
* or with STYLE_COLORED specifying line_desc.text_color */
enum line_styles {
/* Just print the text. Do not clear or draw line decorations */
STYLE_NONE = 0x00,
/* Line background filled with the bg color (or backdrop if present) */
STYLE_DEFAULT = 0x01,
/* Like STYLE_DFEAULT except that text and background color will be swapped */
STYLE_INVERT = 0x02,
/* Line background filled with line color line_desc.line_color */
STYLE_COLORBAR = 0x04,
/* Line background filled with gradient, colors taken from
* line_desc.line_color and line_desc.line_end_color */
STYLE_GRADIENT = 0x08,
/* Modifier for the text color, which will be taken from line_desc.text_color */
STYLE_COLORED = 0x10,
/* These are used internally */
_STYLE_DECO_MASK = 0x0f,
_STYLE_MODE_MASK = 0x7F,
};
struct line_desc {
/* height of the line (in pixels). -1 to inherit the height
* from the font. The text will be centered if the height is larger,
* but the decorations will span the entire height */
int height;
/* multiline support: For some decorations (e.g. gradient) to work
* across multiple lines (e.g. to draw a line selector across 2 lines)
* the line index and line count must be known. For normal, single
* lines specify nlines=1 and line=0 */
/* line count of a group */
int16_t nlines;
/* index of the line in the group */
int16_t line;
/* line text color if STYLE_COLORED is specified, in native
* lcd format (convert with LCD_RGBPACK() if necessary) */
fb_data text_color;
/* line color if STYLE_COLORBAR or STYLE_GRADIENT is specified, in native
* lcd format (convert with LCD_RGBPACK() if necessary) */
fb_data line_color, line_end_color;
/* line decorations, see STYLE_DEFAULT etc. */
enum line_styles style;
/* whether the line can scroll */
bool scroll;
};
/* default initializer, can be used for static initialitation also.
* This initializer will result in single lines without style that don't scroll */
#define LINE_DESC_DEFINIT { .style = STYLE_DEFAULT, .height = -1, .line = 0, .nlines = 1, .scroll = false }
/**
* Print a line at a given pixel postion, using decoration information from
* line and content information from the format specifier. The format specifier
* can include tags that depend on further parameters given to the function
* (similar to the well-known printf()).
*
* Tags start with the $ sign. Below is a list of the currently supported tags:
* $s - insert a column (1px wide) of empty space.
* $S - insert a column (1 char wide) of empty space.
* $i - insert an icon. put_line() expects a corresponding parameter of the
* type 'enum themable_icons'. If Icon_NOICON is passed, then empty
* space (icon-wide) will be inserted.
* $I - insert an icon with padding. Works like $i but additionally
* adds a column (1px wide) of empty space on either side of the icon.
* $t - insert text. put_line() expects a corresponding parameter of the type
* 'const char *'
* $$ - insert a '$' char, use it to escape $.
*
* $I, $s and $S support the following two forms:
* $n[IsS] - inserts n columns (pixels/chars respectively) of empty space
* $*[IsS] - inserts n columns (pixels/chars respectively) of empty space. put_line()
* expects a correspinding paramter of the type 'int' that specifies n.
*
* $t supports the following two forms:
* $nt - skips the first n pixels when displaying the string
* $*t - skips the first n pixels when displaying the string. put_line()
* expects a correspinding paramter of the type 'int' that specifies n.
*
* Inline text will be printed as is (be sure to escape '$') and can be freely
* intermixed with tags. Inline text will be truncated after MAX_PATH+31 bytes.
* If you have a longer inline string use a separate buffer and pass that via $t,
* which does not suffer from this truncation.
*
* Text can appear anywhere, before or after (or both) tags. However, when the
* line can scroll, only the last piece of text (whether inline or via $t) can
* scroll. This is due to a scroll_engine limitation.
*
* x, y - pixel postion of the line.
* line - holds information for the line decorations
* fmt - holds the text and optionally format tags
* ... - additional paramters for the format tags
*
*/
void put_line(struct screen *display,
int x, int y, struct line_desc *line,
const char *fmt, ...);
/**
* Print a line at a given pixel postion, using decoration information from
* line and content information from the format specifier. The format specifier
* can include tags that depend on further parameters given to the function
* (similar to the well-known vprintf()).
*
* For details, see put_line(). This function is equivalent, except for
* accepting a va_list instead of a variable paramter list.
*/
void vput_line(struct screen *display,
int x, int y, struct line_desc *line,
const char *fmt, va_list ap);
#endif /* __LINE_H__*/