Use buflib for all skin engine allocations.

Massive thanks to Michael Chicoine and other testers for finding the early bugs.

This removes all skin memory limitations

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@30991 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Jonathan Gordon 2011-11-15 14:11:08 +00:00
parent 101693fd30
commit 9e07ef2b0a
52 changed files with 954 additions and 862 deletions

View file

@ -175,22 +175,23 @@ bool skinlist_draw(struct screen *display, struct gui_synclist *list)
for (cur_line = 0; cur_line < display_lines; cur_line++)
{
struct skin_element* viewport;
struct skin_viewport* skin_viewport;
struct skin_viewport* skin_viewport = NULL;
if (list_start_item+cur_line+1 > list->nb_items)
break;
current_drawing_line = list_start_item+cur_line;
is_selected = list->show_selection_marker &&
list_start_item+cur_line == list->selected_item;
for (viewport = listcfg[screen]->data->tree;
for (viewport = SKINOFFSETTOPTR(get_skin_buffer(wps.data), listcfg[screen]->data->tree);
viewport;
viewport = viewport->next)
viewport = SKINOFFSETTOPTR(get_skin_buffer(wps.data), viewport->next))
{
int origional_x, origional_y;
int origional_w, origional_h;
char *viewport_label = SKINOFFSETTOPTR(get_skin_buffer(wps.data), skin_viewport->label);
skin_viewport = (struct skin_viewport*)viewport->data;
if (viewport->children == 0 || !skin_viewport->label ||
(skin_viewport->label && strcmp(label, skin_viewport->label))
if (viewport->children == 0 || !viewport_label ||
(skin_viewport->label && strcmp(label, viewport_label))
)
continue;
if (is_selected)
@ -220,15 +221,17 @@ bool skinlist_draw(struct screen *display, struct gui_synclist *list)
display->set_viewport(&skin_viewport->vp);
#ifdef HAVE_LCD_BITMAP
/* Set images to not to be displayed */
struct skin_token_list *imglist = wps.data->images;
struct skin_token_list *imglist = SKINOFFSETTOPTR(get_skin_buffer(wps.data), wps.data->images);
while (imglist)
{
struct gui_img *img = (struct gui_img *)imglist->token->value.data;
struct wps_token *token = SKINOFFSETTOPTR(get_skin_buffer(wps.data), imglist->token);
struct gui_img *img = SKINOFFSETTOPTR(get_skin_buffer(wps.data), token->value.data);
img->display = -1;
imglist = imglist->next;
imglist = SKINOFFSETTOPTR(get_skin_buffer(wps.data), imglist->next);
}
#endif
skin_render_viewport(viewport->children[0],
struct skin_element** children = SKINOFFSETTOPTR(get_skin_buffer(wps.data), viewport->children);
skin_render_viewport(children[0],
&wps, skin_viewport, SKIN_REFRESH_ALL);
#ifdef HAVE_LCD_BITMAP
wps_display_images(&wps, &skin_viewport->vp);

View file

@ -102,7 +102,7 @@ void skin_statusbar_changed(struct gui_wps *skin)
struct wps_data *data = skin->data;
const struct screen *display = skin->display;
const int screen = display->screen_type;
struct skin_viewport *svp = skin_find_item(VP_DEFAULT_LABEL, SKIN_FIND_VP, data);
struct skin_viewport *svp = skin_find_item(VP_DEFAULT_LABEL_STRING, SKIN_FIND_VP, data);
struct viewport *vp = &svp->vp;
viewport_set_defaults(vp, screen);
@ -131,7 +131,7 @@ void skin_statusbar_changed(struct gui_wps *skin)
void draw_progressbar(struct gui_wps *gwps, int line, struct progressbar *pb)
{
struct screen *display = gwps->display;
struct viewport *vp = pb->vp;
struct viewport *vp = SKINOFFSETTOPTR(get_skin_buffer(gwps->data), pb->vp);
struct wps_state *state = skin_get_global_state();
struct mp3entry *id3 = state->id3;
int x = pb->x, y = pb->y, width = pb->width, height = pb->height;
@ -226,9 +226,9 @@ void draw_progressbar(struct gui_wps *gwps, int line, struct progressbar *pb)
flags |= INNER_NOFILL;
}
if (pb->slider)
if (SKINOFFSETTOPTR(get_skin_buffer(gwps->data), pb->slider))
{
struct gui_img *img = pb->slider;
struct gui_img *img = SKINOFFSETTOPTR(get_skin_buffer(gwps->data), pb->slider);
/* clear the slider */
screen_clear_area(display, x, y, width, height);
@ -245,9 +245,9 @@ void draw_progressbar(struct gui_wps *gwps, int line, struct progressbar *pb)
}
}
if (pb->backdrop)
if (SKINOFFSETTOPTR(get_skin_buffer(gwps->data), pb->backdrop))
{
struct gui_img *img = pb->backdrop;
struct gui_img *img = SKINOFFSETTOPTR(get_skin_buffer(gwps->data), pb->backdrop);
img->bm.data = core_get_data(img->buflib_handle);
display->bmp_part(&img->bm, 0, 0, x, y, width, height);
flags |= DONT_CLEAR_EXCESS;
@ -255,11 +255,12 @@ void draw_progressbar(struct gui_wps *gwps, int line, struct progressbar *pb)
if (!pb->nobar)
{
if (pb->image)
struct gui_img *img = SKINOFFSETTOPTR(get_skin_buffer(gwps->data), pb->image);
if (img)
{
char *img_data = core_get_data(pb->image->buflib_handle);
pb->image->bm.data = img_data;
gui_bitmap_scrollbar_draw(display, &pb->image->bm,
char *img_data = core_get_data(img->buflib_handle);
img->bm.data = img_data;
gui_bitmap_scrollbar_draw(display, &img->bm,
x, y, width, height,
length, 0, end, flags);
}
@ -268,11 +269,11 @@ void draw_progressbar(struct gui_wps *gwps, int line, struct progressbar *pb)
length, 0, end, flags);
}
if (pb->slider)
if (SKINOFFSETTOPTR(get_skin_buffer(gwps->data), pb->slider))
{
int xoff = 0, yoff = 0;
int w = width, h = height;
struct gui_img *img = pb->slider;
struct gui_img *img = SKINOFFSETTOPTR(get_skin_buffer(gwps->data), pb->slider);
img->bm.data = core_get_data(img->buflib_handle);
if (flags&HORIZONTAL)
@ -347,11 +348,12 @@ void wps_display_images(struct gui_wps *gwps, struct viewport* vp)
struct wps_data *data = gwps->data;
struct screen *display = gwps->display;
struct skin_token_list *list = data->images;
struct skin_token_list *list = SKINOFFSETTOPTR(get_skin_buffer(data), data->images);
while (list)
{
struct gui_img *img = (struct gui_img*)list->token->value.data;
struct wps_token *token = SKINOFFSETTOPTR(get_skin_buffer(data), list->token);
struct gui_img *img = (struct gui_img*)SKINOFFSETTOPTR(get_skin_buffer(data), token->value.data);
if (img->using_preloaded_icons && img->display >= 0)
{
screen_put_icon(display, img->x, img->y, img->display);
@ -362,20 +364,21 @@ void wps_display_images(struct gui_wps *gwps, struct viewport* vp)
{
wps_draw_image(gwps, img, img->display);
}
else if (img->always_display && img->vp == vp)
else if (img->always_display && SKINOFFSETTOPTR(get_skin_buffer(data), img->vp) == vp)
{
wps_draw_image(gwps, img, 0);
}
}
list = list->next;
list = SKINOFFSETTOPTR(get_skin_buffer(data), list->next);
}
#ifdef HAVE_ALBUMART
/* now draw the AA */
if (data->albumart && data->albumart->vp == vp
&& data->albumart->draw_handle >= 0)
struct skin_albumart *aa = SKINOFFSETTOPTR(get_skin_buffer(data), data->albumart);
if (aa && SKINOFFSETTOPTR(get_skin_buffer(data), aa->vp) == vp
&& aa->draw_handle >= 0)
{
draw_album_art(gwps, data->albumart->draw_handle, false);
data->albumart->draw_handle = -1;
draw_album_art(gwps, aa->draw_handle, false);
aa->draw_handle = -1;
}
#endif
@ -398,8 +401,8 @@ int evaluate_conditional(struct gui_wps *gwps, int offset,
int intval = num_options < 2 ? 2 : num_options;
/* get_token_value needs to know the number of options in the enum */
value = get_token_value(gwps, conditional->token, offset,
result, sizeof(result), &intval);
value = get_token_value(gwps, SKINOFFSETTOPTR(get_skin_buffer(gwps->data), conditional->token),
offset, result, sizeof(result), &intval);
/* intval is now the number of the enum option we want to read,
starting from 1. If intval is -1, we check if value is empty. */

View file

@ -41,19 +41,10 @@
static bool skins_initialising = true;
/* App uses the host malloc to manage the buffer */
#ifdef APPLICATION
#define skin_buffer NULL
void theme_init_buffer(void)
{
skins_initialising = false;
}
#else
static char skin_buffer[SKIN_BUFFER_SIZE];
void theme_init_buffer(void)
{
skins_initialising = false;
}
#endif
void skin_data_free_buflib_allocs(struct wps_data *wps_data);
char* wps_default_skin(enum screen_type screen);
@ -95,8 +86,20 @@ void gui_sync_skin_init(void)
skins[j][i].gui_wps.display = &screens[i];
memset(skins[j][i].gui_wps.data, 0, sizeof(struct wps_data));
skins[j][i].data.wps_loaded = false;
skins[j][i].data.buflib_handle = -1;
skins[j][i].data.tree = -1;
#ifdef HAVE_TOUCHSCREEN
skins[j][i].data.touchregions = -1;
#endif
#ifdef HAVE_SKIN_VARIABLES
skins[j][i].data.skinvars = -1;
#endif
#ifdef HAVE_LCD_BITMAP
skins[j][i].data.font_ids = -1;
skins[j][i].data.images = -1;
#endif
#ifdef HAVE_ALBUMART
skins[j][i].data.albumart = NULL;
skins[j][i].data.albumart = -1;
skins[j][i].data.playback_aa_slot = -1;
#endif
}
@ -113,8 +116,6 @@ void skin_unload_all(void)
skin_data_free_buflib_allocs(&skins[j][i].data);
}
skin_buffer_init(skin_buffer, SKIN_BUFFER_SIZE);
#ifdef HAVE_LCD_BITMAP
skin_backdrop_init();
#endif
@ -245,7 +246,6 @@ struct gui_wps *skin_get_gwps(enum skinnable_screens skin, enum screen_type scre
cpu_boost(false);
loading_a_sbs = false;
}
return &skins[skin][screen].gui_wps;
}

File diff suppressed because it is too large Load diff

View file

@ -27,6 +27,7 @@
#include "strlcat.h"
#include "config.h"
#include "core_alloc.h"
#include "kernel.h"
#ifdef HAVE_ALBUMART
#include "albumart.h"
@ -81,6 +82,18 @@ static void skin_render_playlistviewer(struct playlistviewer* viewer,
unsigned long refresh_type);
#endif
static char* skin_buffer;
/* hack alert: fix skin_parser.c's skin_buffer pointer */
void skinparser_set_buffer(char* pointer);
static inline struct skin_element*
get_child(OFFSETTYPE(struct skin_element**) children, int child)
{
OFFSETTYPE(struct skin_element*) *kids = SKINOFFSETTOPTR(skin_buffer, children);
return SKINOFFSETTOPTR(skin_buffer, kids[child]);
}
static bool do_non_text_tags(struct gui_wps *gwps, struct skin_draw_info *info,
struct skin_element *element, struct viewport* vp)
{
@ -88,7 +101,7 @@ static bool do_non_text_tags(struct gui_wps *gwps, struct skin_draw_info *info,
(void)vp; /* silence warnings */
(void)info;
#endif
struct wps_token *token = (struct wps_token *)element->data;
struct wps_token *token = (struct wps_token *)SKINOFFSETTOPTR(skin_buffer, element->data);
#ifdef HAVE_LCD_BITMAP
struct wps_data *data = gwps->data;
@ -99,14 +112,16 @@ static bool do_non_text_tags(struct gui_wps *gwps, struct skin_draw_info *info,
#if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1))
case SKIN_TOKEN_VIEWPORT_FGCOLOUR:
{
struct viewport_colour *col = token->value.data;
col->vp->fg_pattern = col->colour;
struct viewport_colour *col = SKINOFFSETTOPTR(skin_buffer, token->value.data);
struct viewport *vp = SKINOFFSETTOPTR(skin_buffer, col->vp);
vp->fg_pattern = col->colour;
}
break;
case SKIN_TOKEN_VIEWPORT_BGCOLOUR:
{
struct viewport_colour *col = token->value.data;
col->vp->bg_pattern = col->colour;
struct viewport_colour *col = SKINOFFSETTOPTR(skin_buffer, token->value.data);
struct viewport *vp = SKINOFFSETTOPTR(skin_buffer, col->vp);
vp->bg_pattern = col->colour;
}
break;
case SKIN_TOKEN_VIEWPORT_TEXTSTYLE:
@ -116,7 +131,7 @@ static bool do_non_text_tags(struct gui_wps *gwps, struct skin_draw_info *info,
#ifdef HAVE_LCD_COLOR
case SKIN_TOKEN_VIEWPORT_GRADIENT_SETUP:
{
struct gradient_config *cfg = token->value.data;
struct gradient_config *cfg = SKINOFFSETTOPTR(skin_buffer, token->value.data);
vp->lss_pattern = cfg->start;
vp->lse_pattern = cfg->end;
vp->lst_pattern = cfg->text;
@ -125,14 +140,18 @@ static bool do_non_text_tags(struct gui_wps *gwps, struct skin_draw_info *info,
#endif
case SKIN_TOKEN_VIEWPORT_ENABLE:
{
char *label = token->value.data;
char *label = SKINOFFSETTOPTR(skin_buffer, token->value.data);
char temp = VP_DRAW_HIDEABLE;
struct skin_element *viewport = gwps->data->tree;
struct skin_element *viewport = SKINOFFSETTOPTR(skin_buffer, gwps->data->tree);
while (viewport)
{
struct skin_viewport *skinvp = (struct skin_viewport*)viewport->data;
if (skinvp->label && !skinvp->is_infovp &&
!strcmp(skinvp->label, label))
struct skin_viewport *skinvp = SKINOFFSETTOPTR(skin_buffer, viewport->data);
char *vplabel = SKINOFFSETTOPTR(skin_buffer, skinvp->label);
if (skinvp->label == VP_DEFAULT_LABEL)
vplabel = VP_DEFAULT_LABEL_STRING;
if (vplabel && !skinvp->is_infovp &&
!strcmp(vplabel, label))
{
if (skinvp->hidden_flags&VP_DRAW_HIDDEN)
{
@ -140,7 +159,7 @@ static bool do_non_text_tags(struct gui_wps *gwps, struct skin_draw_info *info,
}
skinvp->hidden_flags = temp;
}
viewport = viewport->next;
viewport = SKINOFFSETTOPTR(skin_buffer, viewport->next);
}
}
break;
@ -148,11 +167,10 @@ static bool do_non_text_tags(struct gui_wps *gwps, struct skin_draw_info *info,
case SKIN_TOKEN_LIST_ITEM_CFG:
if (do_refresh)
skinlist_set_cfg(gwps->display->screen_type,
token->value.data);
SKINOFFSETTOPTR(skin_buffer, token->value.data));
break;
case SKIN_TOKEN_UIVIEWPORT_ENABLE:
sb_set_info_vp(gwps->display->screen_type,
token->value.data);
sb_set_info_vp(gwps->display->screen_type, token->value.data);
break;
case SKIN_TOKEN_PEAKMETER:
data->peak_meter_enabled = true;
@ -173,7 +191,7 @@ static bool do_non_text_tags(struct gui_wps *gwps, struct skin_draw_info *info,
case SKIN_TOKEN_TUNER_RSSI_BAR:
case SKIN_TOKEN_LIST_SCROLLBAR:
{
struct progressbar *bar = (struct progressbar*)token->value.data;
struct progressbar *bar = (struct progressbar*)SKINOFFSETTOPTR(skin_buffer, token->value.data);
if (do_refresh)
draw_progressbar(gwps, info->line_number, bar);
}
@ -183,12 +201,12 @@ static bool do_non_text_tags(struct gui_wps *gwps, struct skin_draw_info *info,
case SKIN_TOKEN_IMAGE_DISPLAY_LISTICON:
case SKIN_TOKEN_IMAGE_PRELOAD_DISPLAY:
{
struct image_display *id = token->value.data;
const char* label = id->label;
struct image_display *id = SKINOFFSETTOPTR(skin_buffer, token->value.data);
const char* label = SKINOFFSETTOPTR(skin_buffer, id->label);
struct gui_img *img = skin_find_item(label,SKIN_FIND_IMAGE, data);
if (img && img->loaded)
{
if (id->token == NULL)
if (SKINOFFSETTOPTR(skin_buffer, id->token) == NULL)
{
img->display = id->subimage;
}
@ -197,8 +215,8 @@ static bool do_non_text_tags(struct gui_wps *gwps, struct skin_draw_info *info,
char buf[16];
const char *out;
int a = img->num_subimages;
out = get_token_value(gwps, id->token, info->offset,
buf, sizeof(buf), &a);
out = get_token_value(gwps, SKINOFFSETTOPTR(skin_buffer, id->token),
info->offset, buf, sizeof(buf), &a);
/* NOTE: get_token_value() returns values starting at 1! */
if (a == -1)
@ -224,29 +242,32 @@ static bool do_non_text_tags(struct gui_wps *gwps, struct skin_draw_info *info,
}
#ifdef HAVE_ALBUMART
case SKIN_TOKEN_ALBUMART_DISPLAY:
{
struct skin_albumart *aa = SKINOFFSETTOPTR(skin_buffer, data->albumart);
/* now draw the AA */
if (do_refresh && data->albumart)
if (do_refresh && aa)
{
int handle = playback_current_aa_hid(data->playback_aa_slot);
#if CONFIG_TUNER
if (in_radio_screen() || (get_radio_status() != FMRADIO_OFF))
{
struct dim dim = {data->albumart->width, data->albumart->height};
struct dim dim = {aa->width, aa->height};
handle = radio_get_art_hid(&dim);
}
#endif
data->albumart->draw_handle = handle;
aa->draw_handle = handle;
}
break;
}
#endif
case SKIN_TOKEN_DRAW_INBUILTBAR:
gui_statusbar_draw(&(statusbars.statusbars[gwps->display->screen_type]),
info->refresh_type == SKIN_REFRESH_ALL,
token->value.data);
SKINOFFSETTOPTR(skin_buffer, token->value.data));
break;
case SKIN_TOKEN_VIEWPORT_CUSTOMLIST:
if (do_refresh)
skin_render_playlistviewer(token->value.data, gwps,
skin_render_playlistviewer(SKINOFFSETTOPTR(skin_buffer, token->value.data), gwps,
info->skin_vp, info->refresh_type);
break;
@ -255,23 +276,24 @@ static bool do_non_text_tags(struct gui_wps *gwps, struct skin_draw_info *info,
case SKIN_TOKEN_VAR_SET:
if (do_refresh)
{
struct skin_var_changer *data = token->value.data;
struct skin_var_changer *data = SKINOFFSETTOPTR(skin_buffer, token->value.data);
struct skin_var *var = SKINOFFSETTOPTR(skin_buffer, data->var);
if (data->direct)
data->var->value = data->newval;
var->value = data->newval;
else
{
data->var->value += data->newval;
var->value += data->newval;
if (data->max)
{
if (data->var->value > data->max)
data->var->value = 1;
else if (data->var->value < 1)
data->var->value = data->max;
if (var->value > data->max)
var->value = 1;
else if (var->value < 1)
var->value = data->max;
}
}
if (data->var->value < 1)
data->var->value = 1;
data->var->last_changed = current_tick;
if (var->value < 1)
var->value = 1;
var->last_changed = current_tick;
}
break;
#endif
@ -289,7 +311,7 @@ static void do_tags_in_hidden_conditional(struct skin_element* branch,
#ifdef HAVE_LCD_BITMAP
struct gui_wps *gwps = info->gwps;
struct wps_data *data = gwps->data;
#endif
#endif
/* Tags here are ones which need to be "turned off" or cleared
* if they are in a conditional branch which isnt being used */
if (branch->type == LINE_ALTERNATOR)
@ -297,12 +319,12 @@ static void do_tags_in_hidden_conditional(struct skin_element* branch,
int i;
for (i=0; i<branch->children_count; i++)
{
do_tags_in_hidden_conditional(branch->children[i], info);
do_tags_in_hidden_conditional(get_child(branch->children, i), info);
}
}
else if (branch->type == LINE && branch->children_count)
{
struct skin_element *child = branch->children[0];
struct skin_element *child = get_child(branch->children, 0);
#if defined(HAVE_LCD_BITMAP) || defined(HAVE_ALBUMART)
struct wps_token *token;
#endif
@ -313,25 +335,25 @@ static void do_tags_in_hidden_conditional(struct skin_element* branch,
int i;
for (i=0; i<child->children_count; i++)
{
do_tags_in_hidden_conditional(child->children[i], info);
do_tags_in_hidden_conditional(get_child(child->children, i), info);
}
child = child->next;
child = SKINOFFSETTOPTR(skin_buffer, child->next);
continue;
}
else if (child->type != TAG || !child->data)
else if (child->type != TAG || !SKINOFFSETTOPTR(skin_buffer, child->data))
{
child = child->next;
child = SKINOFFSETTOPTR(skin_buffer, child->next);
continue;
}
#if defined(HAVE_LCD_BITMAP) || defined(HAVE_ALBUMART)
token = (struct wps_token *)child->data;
token = (struct wps_token *)SKINOFFSETTOPTR(skin_buffer, child->data);
#endif
#ifdef HAVE_LCD_BITMAP
/* clear all pictures in the conditional and nested ones */
if (token->type == SKIN_TOKEN_IMAGE_PRELOAD_DISPLAY)
{
struct image_display *id = token->value.data;
struct gui_img *img = skin_find_item(id->label,
struct image_display *id = SKINOFFSETTOPTR(skin_buffer, token->value.data);
struct gui_img *img = skin_find_item(SKINOFFSETTOPTR(skin_buffer, id->label),
SKIN_FIND_IMAGE, data);
clear_image_pos(gwps, img);
}
@ -341,14 +363,18 @@ static void do_tags_in_hidden_conditional(struct skin_element* branch,
}
else if (token->type == SKIN_TOKEN_VIEWPORT_ENABLE)
{
char *label = token->value.data;
char *label = SKINOFFSETTOPTR(skin_buffer, token->value.data);
struct skin_element *viewport;
for (viewport = data->tree;
for (viewport = SKINOFFSETTOPTR(skin_buffer, data->tree);
viewport;
viewport = viewport->next)
viewport = SKINOFFSETTOPTR(skin_buffer, viewport->next))
{
struct skin_viewport *skin_viewport = (struct skin_viewport*)viewport->data;
if (skin_viewport->label && strcmp(skin_viewport->label, label))
struct skin_viewport *skin_viewport = SKINOFFSETTOPTR(skin_buffer, viewport->data);
char *vplabel = SKINOFFSETTOPTR(skin_buffer, skin_viewport->label);
if (skin_viewport->label == VP_DEFAULT_LABEL)
vplabel = VP_DEFAULT_LABEL_STRING;
if (vplabel && strcmp(vplabel, label))
continue;
if (skin_viewport->hidden_flags&VP_NEVER_VISIBLE)
{
@ -377,7 +403,7 @@ static void do_tags_in_hidden_conditional(struct skin_element* branch,
playback_current_aa_hid(data->playback_aa_slot), true);
}
#endif
child = child->next;
child = SKINOFFSETTOPTR(skin_buffer, child->next);
}
}
}
@ -433,7 +459,7 @@ static bool skin_render_line(struct skin_element* line, struct skin_draw_info *i
if (line->children_count == 0)
return false; /* empty line, do nothing */
struct skin_element *child = line->children[0];
struct skin_element *child = get_child(line->children, 0);
struct conditional *conditional;
skin_render_func func = skin_render_line;
int old_refresh_mode = info->refresh_type;
@ -442,7 +468,7 @@ static bool skin_render_line(struct skin_element* line, struct skin_draw_info *i
switch (child->type)
{
case CONDITIONAL:
conditional = (struct conditional*)child->data;
conditional = SKINOFFSETTOPTR(skin_buffer, child->data);
last_value = conditional->last_value;
value = evaluate_conditional(info->gwps, info->offset,
conditional, child->children_count);
@ -456,20 +482,20 @@ static bool skin_render_line(struct skin_element* line, struct skin_draw_info *i
{
/* we are in a false branch of a %?aa<true> conditional */
if (last_value == 0)
do_tags_in_hidden_conditional(child->children[0], info);
do_tags_in_hidden_conditional(get_child(child->children, 0), info);
break;
}
}
else
{
if (last_value >= 0 && value != last_value && last_value < child->children_count)
do_tags_in_hidden_conditional(child->children[last_value], info);
do_tags_in_hidden_conditional(get_child(child->children, last_value), info);
}
if (child->children[value]->type == LINE_ALTERNATOR)
if (get_child(child->children, value)->type == LINE_ALTERNATOR)
{
func = skin_render_alternator;
}
else if (child->children[value]->type == LINE)
else if (get_child(child->children, value)->type == LINE)
func = skin_render_line;
if (value != last_value)
@ -478,7 +504,7 @@ static bool skin_render_line(struct skin_element* line, struct skin_draw_info *i
info->force_redraw = true;
}
if (func(child->children[value], info))
if (func(get_child(child->children, value), info))
needs_update = true;
else
needs_update = needs_update || (last_value != value);
@ -493,14 +519,14 @@ static bool skin_render_line(struct skin_element* line, struct skin_draw_info *i
fix_line_alignment(info, child);
if (!child->data)
if (!SKINOFFSETTOPTR(skin_buffer, child->data))
{
break;
}
if (!do_non_text_tags(info->gwps, info, child, &info->skin_vp->vp))
{
static char tempbuf[128];
const char *valuestr = get_token_value(info->gwps, child->data,
const char *valuestr = get_token_value(info->gwps, SKINOFFSETTOPTR(skin_buffer, child->data),
info->offset, tempbuf,
sizeof(tempbuf), NULL);
if (valuestr)
@ -517,7 +543,7 @@ static bool skin_render_line(struct skin_element* line, struct skin_draw_info *i
}
break;
case TEXT:
strlcat(info->cur_align_start, child->data,
strlcat(info->cur_align_start, SKINOFFSETTOPTR(skin_buffer, child->data),
info->buf_size - (info->cur_align_start-info->buf));
needs_update = needs_update ||
(info->refresh_type&SKIN_REFRESH_STATIC) != 0;
@ -527,7 +553,7 @@ static bool skin_render_line(struct skin_element* line, struct skin_draw_info *i
break;
}
child = child->next;
child = SKINOFFSETTOPTR(skin_buffer, child->next);
}
return needs_update;
}
@ -541,29 +567,29 @@ static int get_subline_timeout(struct gui_wps *gwps, struct skin_element* line)
{
if (element->children_count == 0)
return retval; /* empty line, so force redraw */
element = element->children[0];
element = get_child(element->children, 0);
}
while (element)
{
if (element->type == TAG &&
element->tag->type == SKIN_TOKEN_SUBLINE_TIMEOUT )
{
token = element->data;
token = SKINOFFSETTOPTR(skin_buffer, element->data);
return token->value.i;
}
else if (element->type == CONDITIONAL)
{
struct conditional *conditional = element->data;
struct conditional *conditional = SKINOFFSETTOPTR(skin_buffer, element->data);
int val = evaluate_conditional(gwps, 0, conditional,
element->children_count);
if (val >= 0)
{
retval = get_subline_timeout(gwps, element->children[val]);
retval = get_subline_timeout(gwps, get_child(element->children, val));
if (retval >= 0)
return retval;
}
}
element = element->next;
element = SKINOFFSETTOPTR(skin_buffer, element->next);
}
return retval;
}
@ -571,7 +597,7 @@ static int get_subline_timeout(struct gui_wps *gwps, struct skin_element* line)
bool skin_render_alternator(struct skin_element* element, struct skin_draw_info *info)
{
bool changed_lines = false;
struct line_alternator *alternator = (struct line_alternator*)element->data;
struct line_alternator *alternator = SKINOFFSETTOPTR(skin_buffer, element->data);
unsigned old_refresh = info->refresh_type;
if (info->refresh_type == SKIN_REFRESH_ALL)
{
@ -597,11 +623,11 @@ bool skin_render_alternator(struct skin_element* element, struct skin_draw_info
try_line++;
if (try_line >= element->children_count)
try_line = 0;
if (element->children[try_line]->children_count != 0)
if (get_child(element->children, try_line)->children_count != 0)
{
current_line = element->children[try_line];
current_line = get_child(element->children, try_line);
rettimeout = get_subline_timeout(info->gwps,
current_line->children[0]);
get_child(current_line->children, 0));
if (rettimeout > 0)
{
suitable = true;
@ -619,7 +645,7 @@ bool skin_render_alternator(struct skin_element* element, struct skin_draw_info
info->refresh_type = SKIN_REFRESH_ALL;
info->force_redraw = true;
}
bool ret = skin_render_line(element->children[alternator->current_line], info);
bool ret = skin_render_line(get_child(element->children, alternator->current_line), info);
info->refresh_type = old_refresh;
return changed_lines || ret;
}
@ -646,14 +672,17 @@ void skin_render_viewport(struct skin_element* viewport, struct gui_wps *gwps,
struct align_pos * align = &info.align;
bool needs_update;
skin_buffer = get_skin_buffer(gwps->data);
skinparser_set_buffer(skin_buffer);
#ifdef HAVE_LCD_BITMAP
/* Set images to not to be displayed */
struct skin_token_list *imglist = gwps->data->images;
struct skin_token_list *imglist = SKINOFFSETTOPTR(skin_buffer, gwps->data->images);
while (imglist)
{
struct gui_img *img = (struct gui_img *)imglist->token->value.data;
struct wps_token *token = SKINOFFSETTOPTR(skin_buffer, imglist->token);
struct gui_img *img = (struct gui_img *)SKINOFFSETTOPTR(skin_buffer, token->value.data);
img->display = -1;
imglist = imglist->next;
imglist = SKINOFFSETTOPTR(skin_buffer, imglist->next);
}
/* fix font ID's */
@ -716,7 +745,7 @@ void skin_render_viewport(struct skin_element* viewport, struct gui_wps *gwps,
}
if (!info.no_line_break)
info.line_number++;
line = line->next;
line = SKINOFFSETTOPTR(skin_buffer, line->next);
}
#ifdef HAVE_LCD_BITMAP
wps_display_images(gwps, &skin_viewport->vp);
@ -730,8 +759,11 @@ void skin_render(struct gui_wps *gwps, unsigned refresh_mode)
struct skin_element* viewport;
struct skin_viewport* skin_viewport;
char *label;
int old_refresh_mode = refresh_mode;
skin_buffer = get_skin_buffer(gwps->data);
skinparser_set_buffer(skin_buffer);
#ifdef HAVE_LCD_CHARCELLS
int i;
@ -741,18 +773,21 @@ void skin_render(struct gui_wps *gwps, unsigned refresh_mode)
data->wps_progress_pat[i] = display->get_locked_pattern();
}
#endif
viewport = data->tree;
skin_viewport = (struct skin_viewport *)viewport->data;
if (skin_viewport->label && viewport->next &&
!strcmp(skin_viewport->label,VP_DEFAULT_LABEL))
viewport = SKINOFFSETTOPTR(skin_buffer, data->tree);
skin_viewport = SKINOFFSETTOPTR(skin_buffer, viewport->data);
label = SKINOFFSETTOPTR(skin_buffer, skin_viewport->label);
if (skin_viewport->label == VP_DEFAULT_LABEL)
label = VP_DEFAULT_LABEL_STRING;
if (label && SKINOFFSETTOPTR(skin_buffer, viewport->next) &&
!strcmp(label,VP_DEFAULT_LABEL_STRING))
refresh_mode = 0;
for (viewport = data->tree;
for (viewport = SKINOFFSETTOPTR(skin_buffer, data->tree);
viewport;
viewport = viewport->next)
viewport = SKINOFFSETTOPTR(skin_buffer, viewport->next))
{
/* SETUP */
skin_viewport = (struct skin_viewport*)viewport->data;
skin_viewport = SKINOFFSETTOPTR(skin_buffer, viewport->data);
unsigned vp_refresh_mode = refresh_mode;
#if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH > 1)
skin_viewport->vp.fg_pattern = skin_viewport->start_fgcolour;
@ -789,7 +824,7 @@ void skin_render(struct gui_wps *gwps, unsigned refresh_mode)
}
/* render */
if (viewport->children_count)
skin_render_viewport(viewport->children[0], gwps,
skin_render_viewport(get_child(viewport->children, 0), gwps,
skin_viewport, vp_refresh_mode);
refresh_mode = old_refresh_mode;
}
@ -826,7 +861,7 @@ void skin_render_playlistviewer(struct playlistviewer* viewer,
struct align_pos * align = &info.align;
bool needs_update;
int cur_pos, start_item, max;
int nb_lines = viewport_get_nb_lines(viewer->vp);
int nb_lines = viewport_get_nb_lines(SKINOFFSETTOPTR(skin_buffer, viewer->vp));
#if CONFIG_TUNER
if (get_current_activity() == ACTIVITY_FM)
{
@ -848,7 +883,7 @@ void skin_render_playlistviewer(struct playlistviewer* viewer,
if (max-start_item > nb_lines)
max = start_item + nb_lines;
line = viewer->line;
line = SKINOFFSETTOPTR(skin_buffer, viewer->line);
while (start_item < max)
{
linebuf[0] = '\0';

View file

@ -36,6 +36,7 @@
#include "debug.h"
#include "cuesheet.h"
#include "replaygain.h"
#include "core_alloc.h"
#ifdef HAVE_LCD_CHARCELLS
#include "hwcompat.h"
#endif
@ -732,18 +733,21 @@ static const char* NOINLINE get_lif_token_value(struct gui_wps *gwps,
{
int a = lif->num_options;
int b;
const char* out_text = get_token_value(gwps, lif->token, offset,
buf, buf_size, &a);
if (a == -1 && lif->token->type != SKIN_TOKEN_VOLUME)
struct wps_token *liftoken = SKINOFFSETTOPTR(get_skin_buffer(gwps->data), lif->token);
const char* out_text = get_token_value(gwps, liftoken, offset, buf, buf_size, &a);
if (a == -1 && liftoken->type != SKIN_TOKEN_VOLUME)
a = (out_text && *out_text) ? 1 : 0;
switch (lif->operand.type)
{
case STRING:
{
char *cmp = SKINOFFSETTOPTR(get_skin_buffer(gwps->data), lif->operand.data.text);
if (out_text == NULL)
return NULL;
a = strcmp(out_text, lif->operand.data.text);
a = strcmp(out_text, cmp);
b = 0;
break;
}
case INTEGER:
case DECIMAL:
b = lif->operand.data.number;
@ -752,11 +756,12 @@ static const char* NOINLINE get_lif_token_value(struct gui_wps *gwps,
{
char temp_buf[MAX_PATH];
const char *outb;
struct wps_token *token = lif->operand.data.code->data;
struct skin_element *element = SKINOFFSETTOPTR(get_skin_buffer(gwps->data), lif->operand.data.code);
struct wps_token *token = SKINOFFSETTOPTR(get_skin_buffer(gwps->data), element->data);
b = lif->num_options;
outb = get_token_value(gwps, token, offset, temp_buf,
sizeof(temp_buf), &b);
if (b == -1 && lif->token->type != SKIN_TOKEN_VOLUME)
if (b == -1 && liftoken->type != SKIN_TOKEN_VOLUME)
{
if (!out_text || !outb)
return (lif->op == IF_EQUALS) ? NULL : "neq";
@ -865,14 +870,15 @@ const char *get_token_value(struct gui_wps *gwps,
{
case SKIN_TOKEN_LOGICAL_IF:
{
struct logical_if *lif = token->value.data;
struct logical_if *lif = SKINOFFSETTOPTR(get_skin_buffer(data), token->value.data);
return get_lif_token_value(gwps, lif, offset, buf, buf_size);
}
break;
case SKIN_TOKEN_SUBSTRING:
{
struct substring *ss = token->value.data;
const char *token_val = get_token_value(gwps, ss->token, offset,
struct substring *ss = SKINOFFSETTOPTR(get_skin_buffer(data), token->value.data);
const char *token_val = get_token_value(gwps,
SKINOFFSETTOPTR(get_skin_buffer(data), ss->token), offset,
buf, buf_size, intval);
if (token_val)
{
@ -909,7 +915,7 @@ const char *get_token_value(struct gui_wps *gwps,
return &(token->value.c);
case SKIN_TOKEN_STRING:
return (char*)token->value.data;
return (char*)SKINOFFSETTOPTR(get_skin_buffer(data), token->value.data);
case SKIN_TOKEN_TRANSLATEDSTRING:
return (char*)P2STR(ID2P(token->value.i));
@ -929,7 +935,7 @@ const char *get_token_value(struct gui_wps *gwps,
return buf;
case SKIN_TOKEN_LIST_ITEM_TEXT:
{
struct listitem *li = (struct listitem *)token->value.data;
struct listitem *li = (struct listitem *)SKINOFFSETTOPTR(get_skin_buffer(data), token->value.data);
return skinlist_get_item_text(li->offset, li->wrap, buf, buf_size);
}
case SKIN_TOKEN_LIST_ITEM_NUMBER:
@ -941,7 +947,7 @@ const char *get_token_value(struct gui_wps *gwps,
return skinlist_is_selected_item()?"s":"";
case SKIN_TOKEN_LIST_ITEM_ICON:
{
struct listitem *li = (struct listitem *)token->value.data;
struct listitem *li = (struct listitem *)SKINOFFSETTOPTR(get_skin_buffer(data), token->value.data);
int icon = skinlist_get_item_icon(li->offset, li->wrap);
if (intval)
*intval = icon;
@ -997,14 +1003,15 @@ const char *get_token_value(struct gui_wps *gwps,
return buf;
#ifdef HAVE_ALBUMART
case SKIN_TOKEN_ALBUMART_FOUND:
if (data->albumart)
if (SKINOFFSETTOPTR(get_skin_buffer(data), data->albumart))
{
int handle = -1;
handle = playback_current_aa_hid(data->playback_aa_slot);
#if CONFIG_TUNER
if (in_radio_screen() || (get_radio_status() != FMRADIO_OFF))
{
struct dim dim = {data->albumart->width, data->albumart->height};
struct skin_albumart *aa = SKINOFFSETTOPTR(get_skin_buffer(data), data->albumart);
struct dim dim = {aa->width, aa->height};
handle = radio_get_art_hid(&dim);
}
#endif
@ -1473,9 +1480,11 @@ const char *get_token_value(struct gui_wps *gwps,
{
#ifdef HAVE_TOUCHSCREEN
unsigned int last_touch = touchscreen_last_touch();
struct touchregion_lastpress *data = token->value.data;
if (data->region)
last_touch = data->region->last_press;
char *skin_base = get_skin_buffer(data);
struct touchregion_lastpress *data = SKINOFFSETTOPTR(skin_base, token->value.data);
struct touchregion *region = SKINOFFSETTOPTR(skin_base, data->region);
if (region)
last_touch = region->last_press;
if (last_touch != 0xffff &&
TIME_BEFORE(current_tick, data->timeout + last_touch))
@ -1805,7 +1814,8 @@ const char *get_token_value(struct gui_wps *gwps,
#ifdef HAVE_SKIN_VARIABLES
case SKIN_TOKEN_VAR_GETVAL:
{
struct skin_var* var = token->value.data;
char *skin_base = get_skin_buffer(data);
struct skin_var* var = SKINOFFSETTOPTR(skin_base, token->value.data);
if (intval)
*intval = var->value;
snprintf(buf, buf_size, "%d", var->value);
@ -1814,8 +1824,10 @@ const char *get_token_value(struct gui_wps *gwps,
break;
case SKIN_TOKEN_VAR_TIMEOUT:
{
struct skin_var_lastchange *data = token->value.data;
unsigned int last_change = data->var->last_changed;
char *skin_base = get_skin_buffer(data);
struct skin_var_lastchange *data = SKINOFFSETTOPTR(skin_base, token->value.data);
struct skin_var* var = SKINOFFSETTOPTR(skin_base, data->var);
unsigned int last_change = var->last_changed;
if (last_change != 0xffff &&
TIME_BEFORE(current_tick, data->timeout + last_change))

View file

@ -1,49 +0,0 @@
/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id$
*
* Copyright (C) 2007 Nicolas Pennequin
*
* 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 _SKIN_TOKENS_H_
#define _SKIN_TOKENS_H_
#include <stdbool.h>
#include "tag_table.h"
struct wps_token {
union {
char c;
unsigned short i;
long l;
void* data;
} value;
enum skin_token_type type; /* enough to store the token type */
/* Whether the tag (e.g. track name or the album) refers the
current or the next song (false=current, true=next) */
bool next;
};
struct skin_token_list {
struct wps_token *token;
struct skin_token_list *next;
};
char* get_dir(char* buf, int buf_size, const char* path, int level);
#endif

View file

@ -37,11 +37,14 @@
/** Disarms all touchregions. */
void skin_disarm_touchregions(struct wps_data *data)
{
struct skin_token_list *regions = data->touchregions;
char* skin_buffer = get_skin_buffer(data);
struct skin_token_list *regions = SKINOFFSETTOPTR(skin_buffer, data->touchregions);
while (regions)
{
((struct touchregion *)regions->token->value.data)->armed = false;
regions = regions->next;
struct wps_token *token = SKINOFFSETTOPTR(skin_buffer, regions->token);
struct touchregion *region = SKINOFFSETTOPTR(skin_buffer, token->value.data);
region->armed = false;
regions = SKINOFFSETTOPTR(skin_buffer, regions->next);
}
}
@ -56,35 +59,39 @@ int skin_get_touchaction(struct wps_data *data, int* edge_offset,
short x,y;
short vx, vy;
int type = action_get_touchscreen_press(&x, &y);
struct skin_viewport *wvp;
struct touchregion *r, *temp = NULL;
char* skin_buffer = get_skin_buffer(data);
bool repeated = (type == BUTTON_REPEAT);
bool released = (type == BUTTON_REL);
bool pressed = (type == BUTTON_TOUCHSCREEN);
struct skin_token_list *regions = data->touchregions;
struct skin_token_list *regions = SKINOFFSETTOPTR(skin_buffer, data->touchregions);
bool needs_repeat;
while (regions)
{
r = (struct touchregion *)regions->token->value.data;
struct wps_token *token = SKINOFFSETTOPTR(skin_buffer, regions->token);
r = SKINOFFSETTOPTR(skin_buffer, token->value.data);
wvp = SKINOFFSETTOPTR(skin_buffer, r->wvp);
/* make sure this region's viewport is visible */
if (r->wvp->hidden_flags&VP_DRAW_HIDDEN)
if (wvp->hidden_flags&VP_DRAW_HIDDEN)
{
regions = regions->next;
regions = SKINOFFSETTOPTR(skin_buffer, regions->next);
continue;
}
if (data->touchscreen_locked &&
(r->action != ACTION_TOUCH_SOFTLOCK && !r->allow_while_locked))
{
regions = regions->next;
regions = SKINOFFSETTOPTR(skin_buffer, regions->next);
continue;
}
needs_repeat = r->press_length != PRESS;
/* check if it's inside this viewport */
if (viewport_point_within_vp(&(r->wvp->vp), x, y))
if (viewport_point_within_vp(&(wvp->vp), x, y))
{ /* reposition the touch inside the viewport since touchregions
* are relative to a preceding viewport */
vx = x - r->wvp->vp.x;
vy = y - r->wvp->vp.y;
vx = x - wvp->vp.x;
vy = y - wvp->vp.y;
/* now see if the point is inside this region */
if (vx >= r->x && vx < r->x+r->width &&
vy >= r->y && vy < r->y+r->height)
@ -127,7 +134,7 @@ int skin_get_touchaction(struct wps_data *data, int* edge_offset,
}
}
}
regions = regions->next;
regions = SKINOFFSETTOPTR(skin_buffer, regions->next);
}
/* On release, all regions are disarmed. */
@ -214,7 +221,7 @@ int skin_get_touchaction(struct wps_data *data, int* edge_offset,
{
case F_T_CUSTOM:
s->custom_setting
->load_from_cfg(s->setting, data->value.text);
->load_from_cfg(s->setting, SKINOFFSETTOPTR(skin_buffer, data->value.text));
break;
case F_T_INT:
case F_T_UINT:

View file

@ -25,6 +25,11 @@
#ifndef _WPS_ENGINE_INTERNALS_
#define _WPS_ENGINE_INTERNALS_
#include "tag_table.h"
#include "skin_parser.h"
#ifndef __PCTOOL__
#include "core_alloc.h"
#endif
/* Timeout unit expressed in HZ. In WPS, all timeouts are given in seconds
(possibly with a decimal fraction) but stored as integer values.
@ -33,52 +38,48 @@
#define TIMEOUT_UNIT (HZ/10) /* I.e. 0.1 sec */
#define DEFAULT_SUBLINE_TIME_MULTIPLIER 20 /* In TIMEOUT_UNIT's */
#include "skin_tokens.h"
#include "tag_table.h"
#include "skin_parser.h"
/* TODO: sort this mess out */
#include "screen_access.h"
#include "statusbar.h"
#include "metadata.h"
/* alignments */
#define WPS_ALIGN_RIGHT 32
#define WPS_ALIGN_CENTER 64
#define WPS_ALIGN_LEFT 128
#define TOKEN_VALUE_ONLY 0x0DEADC0D
#ifdef HAVE_ALBUMART
/* albumart definitions */
#define WPS_ALBUMART_NONE 0 /* WPS does not contain AA tag */
#define WPS_ALBUMART_CHECK 1 /* WPS contains AA conditional tag */
#define WPS_ALBUMART_LOAD 2 /* WPS contains AA tag */
#define WPS_ALBUMART_ALIGN_RIGHT 1 /* x align: right */
#define WPS_ALBUMART_ALIGN_CENTER 2 /* x/y align: center */
#define WPS_ALBUMART_ALIGN_LEFT 4 /* x align: left */
#define WPS_ALBUMART_ALIGN_TOP 1 /* y align: top */
#define WPS_ALBUMART_ALIGN_BOTTOM 4 /* y align: bottom */
#endif /* HAVE_ALBUMART */
/* wps_data*/
struct wps_token {
union {
char c;
unsigned short i;
long l;
OFFSETTYPE(void*) data;
} value;
enum skin_token_type type; /* enough to store the token type */
/* Whether the tag (e.g. track name or the album) refers the
current or the next song (false=current, true=next) */
bool next;
};
char* get_dir(char* buf, int buf_size, const char* path, int level);
struct skin_token_list {
OFFSETTYPE(struct wps_token *) token;
OFFSETTYPE(struct skin_token_list *) next;
};
#ifdef HAVE_LCD_BITMAP
struct gui_img {
struct viewport* vp; /* The viewport to display this image in */
OFFSETTYPE(struct viewport*) vp; /* The viewport to display this image in */
short int x; /* x-pos */
short int y; /* y-pos */
short int num_subimages; /* number of sub-images */
short int subimage_height; /* height of each sub-image */
struct bitmap bm;
int buflib_handle;
const char *label;
OFFSETTYPE(char*) label;
bool loaded; /* load state */
bool always_display; /* not using the preload/display mechanism */
int display;
@ -86,15 +87,15 @@ struct gui_img {
};
struct image_display {
const char *label;
OFFSETTYPE(char*) label;
int subimage;
struct wps_token *token; /* the token to get the subimage number from */
OFFSETTYPE(struct wps_token*) token; /* the token to get the subimage number from */
int offset; /* offset into the bitmap strip to start */
};
struct progressbar {
enum skin_token_type type;
struct viewport *vp;
OFFSETTYPE(struct viewport *) vp;
/* regular pb */
short x;
/* >=0: explicitly set in the tag -> y-coord within the viewport
@ -105,14 +106,14 @@ struct progressbar {
short height;
bool follow_lang_direction;
struct gui_img *image;
OFFSETTYPE(struct gui_img *) image;
bool invert_fill_direction;
bool nofill;
bool nobar;
struct gui_img *slider;
OFFSETTYPE(struct gui_img *) slider;
bool horizontal;
struct gui_img *backdrop;
OFFSETTYPE(struct gui_img *) backdrop;
};
#endif
@ -125,35 +126,11 @@ struct align_pos {
};
#ifdef HAVE_LCD_BITMAP
#define MAX_IMAGES (26*2) /* a-z and A-Z */
#define MAX_PROGRESSBARS 3
/* The image buffer is big enough to store one full-screen native bitmap,
plus two full-screen mono bitmaps. */
#define WPS_MAX_VIEWPORTS 24
#define WPS_MAX_LINES ((LCD_HEIGHT/5+1) * 2)
#define WPS_MAX_SUBLINES (WPS_MAX_LINES*3)
#define WPS_MAX_TOKENS 1150
#define WPS_MAX_STRINGS 128
#define STRING_BUFFER_SIZE 1024
#define WPS_MAX_COND_LEVEL 10
#else
#define WPS_MAX_VIEWPORTS 2
#define WPS_MAX_LINES 2
#define WPS_MAX_SUBLINES 12
#define WPS_MAX_TOKENS 64
#define WPS_MAX_STRINGS 32
#define STRING_BUFFER_SIZE 64
#define WPS_MAX_COND_LEVEL 5
#endif
#define SUBLINE_RESET -1
enum wps_parse_error {
PARSE_OK,
PARSE_FAIL_UNCLOSED_COND,
@ -176,12 +153,17 @@ struct gradient_config {
#define VP_DRAW_WASHIDDEN 0x4
/* these are never drawn, nor cleared, i.e. just ignored */
#define VP_NEVER_VISIBLE 0x8
#define VP_DEFAULT_LABEL "|"
#ifndef __PCTOOL__
#define VP_DEFAULT_LABEL -200
#else
#define VP_DEFAULT_LABEL NULL
#endif
#define VP_DEFAULT_LABEL_STRING "|"
struct skin_viewport {
struct viewport vp; /* The LCD viewport struct */
char hidden_flags;
bool is_infovp;
char* label;
OFFSETTYPE(char*) label;
int parsed_fontid;
#if LCD_DEPTH > 1
unsigned start_fgcolour;
@ -192,14 +174,14 @@ struct skin_viewport {
#endif
};
struct viewport_colour {
struct viewport *vp;
OFFSETTYPE(struct viewport *) vp;
unsigned colour;
};
#ifdef HAVE_TOUCHSCREEN
struct touchregion {
char* label; /* label to identify this region */
struct skin_viewport* wvp;/* The viewport this region is in */
OFFSETTYPE(char*) label; /* label to identify this region */
OFFSETTYPE(struct skin_viewport*) wvp;/* The viewport this region is in */
short int x; /* x-pos */
short int y; /* y-pos */
short int width; /* width */
@ -219,7 +201,7 @@ struct touchregion {
const struct settings_list *setting; /* setting being controlled */
union { /* Value to set the setting to for ACTION_SETTING_SET */
int number;
char* text;
OFFSETTYPE(char*) text;
} value;
} setting_data;
int value;
@ -230,20 +212,32 @@ struct touchregion {
struct touchregion_lastpress {
struct touchregion *region;
OFFSETTYPE(struct touchregion *) region;
long timeout;
};
#endif
struct playlistviewer {
struct viewport *vp;
OFFSETTYPE(struct viewport *) vp;
bool show_icons;
int start_offset;
struct skin_element *line;
OFFSETTYPE(struct skin_element *) line;
};
#ifdef HAVE_ALBUMART
/* albumart definitions */
#define WPS_ALBUMART_NONE 0 /* WPS does not contain AA tag */
#define WPS_ALBUMART_CHECK 1 /* WPS contains AA conditional tag */
#define WPS_ALBUMART_LOAD 2 /* WPS contains AA tag */
#define WPS_ALBUMART_ALIGN_RIGHT 1 /* x align: right */
#define WPS_ALBUMART_ALIGN_CENTER 2 /* x/y align: center */
#define WPS_ALBUMART_ALIGN_LEFT 4 /* x align: left */
#define WPS_ALBUMART_ALIGN_TOP 1 /* y align: top */
#define WPS_ALBUMART_ALIGN_BOTTOM 4 /* y align: bottom */
struct skin_albumart {
/* Album art support */
int x;
@ -255,7 +249,7 @@ struct skin_albumart {
unsigned char yalign; /* WPS_ALBUMART_ALIGN_TOP, _CENTER, _BOTTOM */
unsigned char state; /* WPS_ALBUMART_NONE, _CHECK, _LOAD */
struct viewport *vp;
OFFSETTYPE(struct viewport *) vp;
int draw_handle;
};
#endif
@ -272,11 +266,11 @@ struct line_alternator {
struct conditional {
int last_value;
struct wps_token *token;
OFFSETTYPE(struct wps_token *) token;
};
struct logical_if {
struct wps_token *token;
OFFSETTYPE(struct wps_token *) token;
enum {
IF_EQUALS, /* == */
IF_NOTEQUALS, /* != */
@ -292,7 +286,7 @@ struct logical_if {
struct substring {
int start;
int length;
struct wps_token *token;
OFFSETTYPE(struct wps_token *) token;
};
struct listitem {
@ -302,16 +296,16 @@ struct listitem {
#ifdef HAVE_SKIN_VARIABLES
struct skin_var {
const char *label;
OFFSETTYPE(const char *) label;
int value;
long last_changed;
};
struct skin_var_lastchange {
struct skin_var *var;
OFFSETTYPE(struct skin_var *) var;
long timeout;
};
struct skin_var_changer {
struct skin_var *var;
OFFSETTYPE(struct skin_var *) var;
int newval;
bool direct; /* true to make val=newval, false for val += newval */
int max;
@ -323,30 +317,29 @@ struct skin_var_changer {
viewable content of a wps */
struct wps_data
{
struct skin_element *tree;
int buflib_handle;
OFFSETTYPE(struct skin_element *) tree;
#ifdef HAVE_LCD_BITMAP
struct skin_token_list *images;
int *font_ids;
OFFSETTYPE(struct skin_token_list *) images;
OFFSETTYPE(int *) font_ids;
int font_count;
#endif
#if LCD_DEPTH > 1 || defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH > 1
struct {
char *backdrop;
int backdrop_id;
};
int backdrop_id;
#endif
#ifdef HAVE_TOUCHSCREEN
struct skin_token_list *touchregions;
OFFSETTYPE(struct skin_token_list *) touchregions;
bool touchscreen_locked;
#endif
#ifdef HAVE_ALBUMART
struct skin_albumart *albumart;
OFFSETTYPE(struct skin_albumart *) albumart;
int playback_aa_slot;
#endif
#ifdef HAVE_SKIN_VARIABLES
struct skin_token_list *skinvars;
OFFSETTYPE(struct skin_token_list *) skinvars;
#endif
#ifdef HAVE_LCD_BITMAP
@ -360,6 +353,17 @@ struct wps_data
bool wps_loaded;
};
#ifndef __PCTOOL__
static inline char* get_skin_buffer(struct wps_data* data)
{
if (data->buflib_handle >= 0)
return core_get_data(data->buflib_handle);
return NULL;
}
#else
#define get_skin_buffer(d) skin_buffer
#endif
/* wps_data end */
/* wps_state

View file

@ -87,8 +87,9 @@ int sb_postproccess(enum screen_type screen, struct wps_data *data)
/* hide the sb's default viewport because it has nasty effect with stuff
* not part of the statusbar,
* hence .sbs's without any other vps are unsupported*/
struct skin_viewport *vp = skin_find_item(VP_DEFAULT_LABEL, SKIN_FIND_VP, data);
struct skin_element *next_vp = data->tree->next;
struct skin_viewport *vp = skin_find_item(VP_DEFAULT_LABEL_STRING, SKIN_FIND_VP, data);
struct skin_element *tree = SKINOFFSETTOPTR(get_skin_buffer(data), data->tree);
struct skin_element *next_vp = SKINOFFSETTOPTR(get_skin_buffer(data), tree->next);
if (vp)
{
@ -105,9 +106,9 @@ int sb_postproccess(enum screen_type screen, struct wps_data *data)
return 1;
}
static char *infovp_label[NB_SCREENS];
static char *oldinfovp_label[NB_SCREENS];
void sb_set_info_vp(enum screen_type screen, char *label)
static OFFSETTYPE(char*) infovp_label[NB_SCREENS];
static OFFSETTYPE(char*) oldinfovp_label[NB_SCREENS];
void sb_set_info_vp(enum screen_type screen, OFFSETTYPE(char*) label)
{
infovp_label[screen] = label;
}
@ -116,15 +117,19 @@ struct viewport *sb_skin_get_info_vp(enum screen_type screen)
{
struct wps_data *data = skin_get_gwps(CUSTOM_STATUSBAR, screen)->data;
struct skin_viewport *vp = NULL;
char *label;
if (oldinfovp_label[screen] &&
strcmp(oldinfovp_label[screen], infovp_label[screen]))
(oldinfovp_label[screen] != infovp_label[screen]))
{
/* UI viewport changed, so force a redraw */
oldinfovp_label[screen] = infovp_label[screen];
viewportmanager_theme_enable(screen, false, NULL);
viewportmanager_theme_undo(screen, true);
}
vp = skin_find_item(infovp_label[screen], SKIN_FIND_UIVP, data);
label = SKINOFFSETTOPTR(get_skin_buffer(data), infovp_label[screen]);
if (infovp_label[screen] == VP_DEFAULT_LABEL)
label = VP_DEFAULT_LABEL_STRING;
vp = skin_find_item(label, SKIN_FIND_UIVP, data);
if (!vp)
return NULL;
if (vp->parsed_fontid == 1)
@ -270,7 +275,7 @@ void sb_skin_init(void)
{
FOR_NB_SCREENS(i)
{
oldinfovp_label[i] = NULL;
oldinfovp_label[i] = VP_DEFAULT_LABEL;
}
}

View file

@ -36,7 +36,7 @@ void sb_skin_data_load(enum screen_type screen, const char *buf, bool isfile);
char* sb_create_from_settings(enum screen_type screen);
void sb_skin_init(void) INIT_ATTR;
void sb_set_info_vp(enum screen_type screen, char *label);
void sb_set_info_vp(enum screen_type screen, OFFSETTYPE(char*) label);
struct viewport *sb_skin_get_info_vp(enum screen_type screen);
void sb_skin_update(enum screen_type screen, bool force);

View file

@ -667,7 +667,7 @@ static void gwps_enter_wps(void)
#if LCD_DEPTH > 1
if (display->depth > 1)
{
struct skin_viewport *svp = skin_find_item(VP_DEFAULT_LABEL,
struct skin_viewport *svp = skin_find_item(VP_DEFAULT_LABEL_STRING,
SKIN_FIND_VP, gwps->data);
if (svp)
{

View file

@ -11502,16 +11502,16 @@
</phrase>
<phrase>
id: LANG_SKIN_RAM_USAGE
desc: how much RAM the skins are using
desc: deprecated
user: core
<source>
*: "Skin RAM usage:"
*: ""
</source>
<dest>
*: "Azalaren RAM erabilera:"
*: ""
</dest>
<voice>
*: "Azalaren RAM erabilera:"
*: ""
</voice>
</phrase>
<phrase>

View file

@ -12255,16 +12255,16 @@
</phrase>
<phrase>
id: LANG_SKIN_RAM_USAGE
desc: how much RAM the skins are using
desc: deprecated
user: core
<source>
*: "Skin RAM usage:"
*: ""
</source>
<dest>
*: "Използвана RAM от скина:"
*: ""
</dest>
<voice>
*: "Използвана RAM от скина"
*: ""
</voice>
</phrase>
<phrase>

View file

@ -11494,16 +11494,16 @@
</phrase>
<phrase>
id: LANG_SKIN_RAM_USAGE
desc: how much RAM the skins are using
desc: deprecated
user: core
<source>
*: "Skin RAM usage:"
*: ""
</source>
<dest>
*: "Ús de RAM per part del tema:"
*: ""
</dest>
<voice>
*: "Ús de RAM per part del tema"
*: ""
</voice>
</phrase>
<phrase>

View file

@ -11821,16 +11821,16 @@
</phrase>
<phrase>
id: LANG_SKIN_RAM_USAGE
desc: how much RAM the skins are using
desc: deprecated
user: core
<source>
*: "Skin RAM usage:"
*: ""
</source>
<dest>
*: "Skin RAM usage:"
*: ""
</dest>
<voice>
*: "Skin RAM usage"
*: ""
</voice>
</phrase>
<phrase>

View file

@ -11504,16 +11504,16 @@
</phrase>
<phrase>
id: LANG_SKIN_RAM_USAGE
desc: how much RAM the skins are using
desc: deprecated
user: core
<source>
*: "Skin RAM usage:"
*: ""
</source>
<dest>
*: "Využití RAM pro skiny:"
*: ""
</dest>
<voice>
*: "Využití RAM pro skiny"
*: ""
</voice>
</phrase>
<phrase>

View file

@ -11446,16 +11446,16 @@
</phrase>
<phrase>
id: LANG_SKIN_RAM_USAGE
desc: how much RAM the skins are using
desc: deprecated
user: core
<source>
*: "Skin RAM usage:"
*: ""
</source>
<dest>
*: "Temas RAM-forbrug:"
*: ""
</dest>
<voice>
*: "Temas RAM-forbrug"
*: ""
</voice>
</phrase>
<phrase>

View file

@ -11445,16 +11445,16 @@
</phrase>
<phrase>
id: LANG_SKIN_RAM_USAGE
desc: how much RAM the skins are using
desc: deprecated
user: core
<source>
*: "Skin RAM usage:"
*: ""
</source>
<dest>
*: "Themen-Speicher:"
*: ""
</dest>
<voice>
*: "Themen-Speicher"
*: ""
</voice>
</phrase>
<phrase>

View file

@ -11500,16 +11500,16 @@
</phrase>
<phrase>
id: LANG_SKIN_RAM_USAGE
desc: how much RAM the skins are using
desc: deprecated
user: core
<source>
*: "Skin RAM usage:"
*: ""
</source>
<dest>
*: "Skin RAM usage:"
*: ""
</dest>
<voice>
*: "Skin RAM usage"
*: ""
</voice>
</phrase>
<phrase>

View file

@ -11587,16 +11587,16 @@
</phrase>
<phrase>
id: LANG_SKIN_RAM_USAGE
desc: how much RAM the skins are using
desc: deprecated
user: core
<source>
*: "Skin RAM usage:"
*: ""
</source>
<dest>
*: "Skin RAM usage:"
*: ""
</dest>
<voice>
*: "Skin RAM usage"
*: ""
</voice>
</phrase>
<phrase>

View file

@ -11816,16 +11816,16 @@
</phrase>
<phrase>
id: LANG_SKIN_RAM_USAGE
desc: how much RAM the skins are using
desc: deprecated
user: core
<source>
*: "Skin RAM usage:"
*: ""
</source>
<dest>
*: "Uso de RAM de la piel:"
*: ""
</dest>
<voice>
*: "Uso de RAM de la piel"
*: ""
</voice>
</phrase>
<phrase>

View file

@ -11383,16 +11383,16 @@
</phrase>
<phrase>
id: LANG_SKIN_RAM_USAGE
desc: how much RAM the skins are using
desc: deprecated
user: core
<source>
*: "Skin RAM usage:"
*: ""
</source>
<dest>
*: "Nahan käyttämä RAM-muisti:"
*: ""
</dest>
<voice>
*: "Nahan käyttämä RAM-muisti"
*: ""
</voice>
</phrase>
<phrase>

View file

@ -11528,16 +11528,16 @@
</phrase>
<phrase>
id: LANG_SKIN_RAM_USAGE
desc: how much RAM the skins are using
desc: deprecated
user: core
<source>
*: "Skin RAM usage:"
*: ""
</source>
<dest>
*: "Tampon du thème:"
*: ""
</dest>
<voice>
*: "Tampon du thème utilisé"
*: ""
</voice>
</phrase>
<phrase>

View file

@ -10883,16 +10883,16 @@ ipod*,iaudiox5,iaudiom5,iriverh10,iriverh10_5gb,sansae200*,sansac200*,gigabeat*,
</phrase>
<phrase>
id: LANG_SKIN_RAM_USAGE
desc: how much RAM the skins are using
desc: deprecated
user: core
<source>
*: "Skin RAM usage:"
*: ""
</source>
<dest>
*: "Uso de RAM pola skin:"
*: ""
</dest>
<voice>
*: "Uso de RAM pola skin"
*: ""
</voice>
</phrase>
<phrase>

View file

@ -11509,16 +11509,16 @@
</phrase>
<phrase>
id: LANG_SKIN_RAM_USAGE
desc: how much RAM the skins are using
desc: deprecated
user: core
<source>
*: "Skin RAM usage:"
*: ""
</source>
<dest>
*: "Skin RAM usage:"
*: ""
</dest>
<voice>
*: "Skin RAM usage"
*: ""
</voice>
</phrase>
<phrase>

View file

@ -11503,16 +11503,16 @@
</phrase>
<phrase>
id: LANG_SKIN_RAM_USAGE
desc: how much RAM the skins are using
desc: deprecated
user: core
<source>
*: "Skin RAM usage:"
*: ""
</source>
<dest>
*: "Korištenje RAM-a presvlake:"
*: ""
</dest>
<voice>
*: "Korištenje RAM-a presvlake"
*: ""
</voice>
</phrase>
<phrase>

View file

@ -11504,16 +11504,16 @@ desc: deprecated
</phrase>
<phrase>
id: LANG_SKIN_RAM_USAGE
desc: how much RAM the skins are using
desc: deprecated
user: core
<source>
*: "Skin RAM usage:"
*: ""
</source>
<dest>
*: "RAM usata per Skin:"
*: ""
</dest>
<voice>
*: "RAM usata per Skin"
*: ""
</voice>
</phrase>
<phrase>

View file

@ -11509,16 +11509,16 @@
</phrase>
<phrase>
id: LANG_SKIN_RAM_USAGE
desc: how much RAM the skins are using
desc: deprecated
user: core
<source>
*: "Skin RAM usage:"
*: ""
</source>
<dest>
*: "スキンのRAM使用量:"
*: ""
</dest>
<voice>
*: "スキンのRAM使用量"
*: ""
</voice>
</phrase>
<phrase>

View file

@ -11505,16 +11505,16 @@
</phrase>
<phrase>
id: LANG_SKIN_RAM_USAGE
desc: how much RAM the skins are using
desc: deprecated
user: core
<source>
*: "Skin RAM usage:"
*: ""
</source>
<dest>
*: "Ādas RAM izl.:"
*: ""
</dest>
<voice>
*: "aadas ram izlietojums"
*: ""
</voice>
</phrase>
<phrase>

View file

@ -11366,16 +11366,16 @@
</phrase>
<phrase>
id: LANG_SKIN_RAM_USAGE
desc: how much RAM the skins are using
desc: deprecated
user: core
<source>
*: "Skin RAM usage:"
*: ""
</source>
<dest>
*: "Téma RAM használat:"
*: ""
</dest>
<voice>
*: "Téma RAM használat"
*: ""
</voice>
</phrase>
<phrase>

View file

@ -11852,16 +11852,16 @@
</phrase>
<phrase>
id: LANG_SKIN_RAM_USAGE
desc: how much RAM the skins are using
desc: deprecated
user: core
<source>
*: "Skin RAM usage:"
*: ""
</source>
<dest>
*: "Uitzicht RAM gebruik:"
*: ""
</dest>
<voice>
*: "Uitzicht RAM gebruik"
*: ""
</voice>
</phrase>
<phrase>

View file

@ -11426,16 +11426,16 @@
</phrase>
<phrase>
id: LANG_SKIN_RAM_USAGE
desc: how much RAM the skins are using
desc: deprecated
user: core
<source>
*: "Skin RAM usage:"
*: ""
</source>
<dest>
*: "Pamięć zajmowana przez styl:"
*: ""
</dest>
<voice>
*: "Pamięć zajmowana przez styl"
*: ""
</voice>
</phrase>
<phrase>

View file

@ -11501,16 +11501,16 @@
</phrase>
<phrase>
id: LANG_SKIN_RAM_USAGE
desc: how much RAM the skins are using
desc: deprecated
user: core
<source>
*: "Skin RAM usage:"
*: ""
</source>
<dest>
*: "Uso de RAM do Skin:"
*: ""
</dest>
<voice>
*: "Uso de RAM do Skin"
*: ""
</voice>
</phrase>
<phrase>

View file

@ -11679,16 +11679,16 @@
</phrase>
<phrase>
id: LANG_SKIN_RAM_USAGE
desc: how much RAM the skins are using
desc: deprecated
user: core
<source>
*: "Skin RAM usage:"
*: ""
</source>
<dest>
*: "Uso de RAM do Visual:"
*: ""
</dest>
<voice>
*: "Uso de RAM do Visual"
*: ""
</voice>
</phrase>
<phrase>

View file

@ -12501,16 +12501,16 @@
<phrase>
id: LANG_SKIN_RAM_USAGE
desc: how much RAM the skins are using
desc: deprecated
user: core
<source>
*: "Skin RAM usage:"
*: ""
</source>
<dest>
*: "Utilizare RAM de către skin:"
*: ""
</dest>
<voice>
*: "Utilizare RAM de către skin:"
*: ""
</voice>
</phrase>

View file

@ -12219,16 +12219,16 @@
</phrase>
<phrase>
id: LANG_SKIN_RAM_USAGE
desc: how much RAM the skins are using
desc: deprecated
user: core
<source>
*: "Skin RAM usage:"
*: ""
</source>
<dest>
*: "RAM для темы:"
*: ""
</dest>
<voice>
*: "RAM для темы"
*: ""
</voice>
</phrase>
<phrase>

View file

@ -11500,16 +11500,16 @@
</phrase>
<phrase>
id: LANG_SKIN_RAM_USAGE
desc: how much RAM the skins are using
desc: deprecated
user: core
<source>
*: "Skin RAM usage:"
*: ""
</source>
<dest>
*: "Pamäť Ram využitá vzhľadom"
*: ""
</dest>
<voice>
*: "Pamäť RAM využitá vzhľadom"
*: ""
</voice>
</phrase>
<phrase>

View file

@ -9764,16 +9764,16 @@
</phrase>
<phrase>
id: LANG_SKIN_RAM_USAGE
desc: how much RAM the skins are using
desc: deprecated
user: core
<source>
*: "Skin RAM usage:"
*: ""
</source>
<dest>
*: "Skin RAM usage:"
*: ""
</dest>
<voice>
*: "Skin RAM usage"
*: ""
</voice>
</phrase>
<phrase>

View file

@ -11784,16 +11784,16 @@
</phrase>
<phrase>
id: LANG_SKIN_RAM_USAGE
desc: how much RAM the skins are using
desc: deprecated
user: core
<source>
*: "Skin RAM usage:"
*: ""
</source>
<dest>
*: "Потрошња RAM за скинове:"
*: ""
</dest>
<voice>
*: "Потрошња RAM за скинове"
*: ""
</voice>
</phrase>
<phrase>

View file

@ -11506,16 +11506,16 @@
</phrase>
<phrase>
id: LANG_SKIN_RAM_USAGE
desc: how much RAM the skins are using
desc: deprecated
user: core
<source>
*: "Skin RAM usage:"
*: ""
</source>
<dest>
*: "Tema:"
*: ""
</dest>
<voice>
*: "Tema"
*: ""
</voice>
</phrase>
<phrase>

View file

@ -11394,16 +11394,16 @@
</phrase>
<phrase>
id: LANG_SKIN_RAM_USAGE
desc: how much RAM the skins are using
desc: deprecated
user: core
<source>
*: "Skin RAM usage:"
*: ""
</source>
<dest>
*: "Skin RAM usage:"
*: ""
</dest>
<voice>
*: "Skin RAM usage"
*: ""
</voice>
</phrase>
<phrase>

View file

@ -11342,16 +11342,16 @@
</phrase>
<phrase>
id: LANG_SKIN_RAM_USAGE
desc: how much RAM the skins are using
desc: deprecated
user: core
<source>
*: "Skin RAM usage:"
*: ""
</source>
<dest>
*: "หน่วยความจำหน้ากาก:"
*: ""
</dest>
<voice>
*: "Skin RAM usage"
*: ""
</voice>
</phrase>
<phrase>

View file

@ -11505,16 +11505,16 @@
</phrase>
<phrase>
id: LANG_SKIN_RAM_USAGE
desc: how much RAM the skins are using
desc: deprecated
user: core
<source>
*: "Skin RAM usage:"
*: ""
</source>
<dest>
*: "Memwere eployeye pol pea:"
*: ""
</dest>
<voice>
*: "Memwere eployeye pol pea"
*: ""
</voice>
</phrase>
<phrase>

View file

@ -147,9 +147,6 @@ enum infoscreenorder
INFO_DISK1, /* capacity or internal capacity/free on hotswap */
INFO_DISK2, /* free space or external capacity/free on hotswap */
INFO_BUFFER,
#ifndef APPLICATION
INFO_SKIN_USAGE, /* ram usage of the skins */
#endif
INFO_VERSION,
INFO_COUNT
};
@ -159,7 +156,7 @@ static const char* info_getname(int selected_item, void *data,
{
struct info_data *info = (struct info_data*)data;
char s1[32];
#if defined(HAVE_MULTIVOLUME) || !defined(APPLICATION)
#if defined(HAVE_MULTIVOLUME)
char s2[32];
#endif
if (info->new_data)
@ -246,14 +243,6 @@ static const char* info_getname(int selected_item, void *data,
snprintf(buffer, buffer_len, SIZE_FMT, str(LANG_DISK_SIZE_INFO), s1);
#endif
break;
#ifndef APPLICATION
case INFO_SKIN_USAGE:
output_dyn_value(s1, sizeof s1, skin_buffer_usage(), byte_units, true);
output_dyn_value(s2, sizeof s2, skin_buffer_usage()
+skin_buffer_freespace(), byte_units, true);
snprintf(buffer, buffer_len, "%s %s / %s", str(LANG_SKIN_RAM_USAGE), s1, s2);
break;
#endif
}
return buffer;
}
@ -334,12 +323,6 @@ static int info_speak_item(int selected_item, void * data)
output_dyn_value(NULL, 0, info->size, kbyte_units, true);
#endif
break;
#ifndef APPLICATION
case INFO_SKIN_USAGE:
talk_id(LANG_SKIN_RAM_USAGE, false);
output_dyn_value(NULL, 0, skin_buffer_usage(), byte_units, true);
break;
#endif
}
return 0;

View file

@ -305,7 +305,7 @@ void draw_album_art(struct gui_wps *gwps, int handle_id, bool clear)
return;
struct wps_data *data = gwps->data;
struct skin_albumart *aa = data->albumart;
struct skin_albumart *aa = SKINOFFSETTOPTR(get_skin_buffer(data), data->albumart);
if (!aa)
return;

View file

@ -47,54 +47,26 @@
#ifdef ROCKBOX
#include "config.h"
#include "skin_debug.h"
#ifdef APPLICATION
# define USE_HOST_MALLOC
#else
# define USE_ROCKBOX_ALLOC
#endif
#endif
#ifdef USE_ROCKBOX_ALLOC
static size_t buf_size;
static unsigned char *buffer_start = NULL;
static unsigned char *buffer_front = NULL;
#endif
#ifdef USE_HOST_MALLOC
struct malloc_object {
struct malloc_object *next;
char buf[0];
};
static struct malloc_object *malloced_head = NULL, *malloced_tail = NULL;
static void skin_free_malloced(void)
#ifndef __PCTOOL__
long skin_buffer_to_offset(void *pointer)
{
struct malloc_object *obj = malloced_head;
struct malloc_object *this;
while (obj)
{
this = obj;
obj = this->next;
free(this);
}
malloced_head = NULL;
malloced_tail = NULL;
return pointer == NULL ? -1 : (void*)pointer - (void*)buffer_start;
}
void* skin_buffer_from_offset(long offset)
{
return offset < 0 ? NULL : buffer_start + offset;
}
#endif
void skin_buffer_init(char* buffer, size_t size)
{
#ifdef USE_ROCKBOX_ALLOC
buffer_start = buffer_front = buffer;
buf_size = size;
#elif defined(USE_HOST_MALLOC)
(void)buffer; (void)size;
skin_free_malloced();
#endif
}
/* Allocate size bytes from the buffer */
@ -108,8 +80,6 @@ void* skin_buffer_alloc(size_t size)
{
void *retval = NULL;
#endif
#ifdef USE_ROCKBOX_ALLOC
/* 32-bit aligned */
size = (size + 3) & ~3;
if (size > skin_buffer_freespace())
@ -119,25 +89,9 @@ void* skin_buffer_alloc(size_t size)
}
retval = buffer_front;
buffer_front += size;
#elif defined(USE_HOST_MALLOC)
size_t malloc_size = sizeof(struct malloc_object) + size;
struct malloc_object *obj = malloc(malloc_size);
retval = &obj->buf;
obj->next = NULL;
if (malloced_tail == NULL)
malloced_head = malloced_tail = obj;
else
malloced_tail->next = obj;
malloced_tail = obj;
#else
retval = malloc(size);
#endif
return retval;
}
#ifdef USE_ROCKBOX_ALLOC
/* get the number of bytes currently being used */
size_t skin_buffer_usage(void)
{
@ -147,16 +101,9 @@ size_t skin_buffer_freespace(void)
{
return buf_size - skin_buffer_usage();
}
static unsigned char *saved_buffer_pos = NULL;
void skin_buffer_save_position(void)
#else
void* skin_buffer_alloc(size_t size)
{
saved_buffer_pos = buffer_front;
}
void skin_buffer_restore_position(void)
{
if (saved_buffer_pos)
buffer_front = saved_buffer_pos;
return malloc(size);
}
#endif

View file

@ -28,6 +28,18 @@
void skin_buffer_init(char* buffer, size_t size);
/* Allocate size bytes from the buffer */
#ifndef __PCTOOL__
#define INVALID_OFFSET (-1)
#define IS_VALID_OFFSET(o) ((o) >= 0)
long skin_buffer_to_offset(void *pointer);
void* skin_buffer_from_offset(long offset);
#else
#define INVALID_OFFSET (NULL)
#define IS_VALID_OFFSET(o) ((o) != NULL)
#define skin_buffer_to_offset(p) p
#define skin_buffer_from_offset(o) o
#endif
/* #define DEBUG_SKIN_ALLOCATIONS */
#ifdef DEBUG_SKIN_ALLOCATIONS
@ -44,7 +56,4 @@ void* skin_buffer_alloc(size_t size);
size_t skin_buffer_usage(void);
size_t skin_buffer_freespace(void);
/* save and restore a buffer position incase a skin fails to load */
void skin_buffer_save_position(void);
void skin_buffer_restore_position(void);
#endif

View file

@ -31,6 +31,7 @@
int debug_indent_level = 0;
extern int skin_line;
extern char* skin_start;
extern char* skin_buffer;
/* Global error variables */
int error_line;
@ -38,6 +39,14 @@ int error_col;
const char *error_line_start;
char* error_message;
static inline struct skin_element*
get_child(OFFSETTYPE(struct skin_element**) children, int child)
{
struct skin_element **kids = SKINOFFSETTOPTR(skin_buffer, children);
return kids[child];
}
/* Debugging functions */
void skin_error(enum skin_errorcode error, const char* cursor)
{
@ -144,14 +153,14 @@ void skin_debug_tree(struct skin_element* root)
printf("{ Viewport \n");
debug_indent_level++;
skin_debug_tree(current->children[0]);
skin_debug_tree(get_child(current->children, 0));
debug_indent_level--;
printf("}");
break;
case TEXT:
text = current->data;
text = SKINOFFSETTOPTR(skin_buffer, current->data);
printf("* Plain text on line %d: \"%s\"\n", current->line, text);
break;
@ -166,7 +175,7 @@ void skin_debug_tree(struct skin_element* root)
current->tag->name,
current->line, current->params_count);
debug_indent_level++;
skin_debug_params(current->params_count, current->params);
skin_debug_params(current->params_count, SKINOFFSETTOPTR(skin_buffer, current->params));
debug_indent_level--;
skin_debug_indent();
printf(")\n");
@ -185,7 +194,7 @@ void skin_debug_tree(struct skin_element* root)
debug_indent_level++;
for(i = 0; i < current->children_count; i++)
{
skin_debug_tree(current->children[i]);
skin_debug_tree(get_child(current->children, i));
}
debug_indent_level--;
@ -203,7 +212,7 @@ void skin_debug_tree(struct skin_element* root)
skin_debug_indent();
printf("[ Enumeration %d\n", i);
debug_indent_level++;
skin_debug_tree(current->children[i]);
skin_debug_tree(get_child(current->children, i));
debug_indent_level--;
skin_debug_indent();
printf("]\n");
@ -221,7 +230,7 @@ void skin_debug_tree(struct skin_element* root)
debug_indent_level++;
if (current->children)
skin_debug_tree(current->children[0]);
skin_debug_tree(get_child(current->children, 0));
debug_indent_level--;
skin_debug_indent();
@ -229,7 +238,7 @@ void skin_debug_tree(struct skin_element* root)
break;
}
current = current->next;
current = SKINOFFSETTOPTR(skin_buffer, current->next);
}
}
@ -248,7 +257,7 @@ void skin_debug_params(int count, struct skin_tag_parameter params[])
break;
case STRING:
printf("string: \"%s\"", params[i].data.text);
printf("string: \"%s\"", SKINOFFSETTOPTR(skin_buffer, params[i].data.text));
break;
case INTEGER:
@ -263,7 +272,7 @@ void skin_debug_params(int count, struct skin_tag_parameter params[])
case CODE:
printf("Skin Code: \n");
debug_indent_level++;
skin_debug_tree(params[i].data.code);
skin_debug_tree(SKINOFFSETTOPTR(skin_buffer, params[i].data.code));
debug_indent_level--;
skin_debug_indent();
break;

View file

@ -37,8 +37,6 @@ int skin_line = 0;
char* skin_start = 0;
int viewport_line = 0;
static int tag_recursion_level = 0;
#ifdef ROCKBOX
static skin_callback callback = NULL;
static void* callback_data;
@ -81,8 +79,6 @@ struct skin_element* skin_parse(const char* document)
struct skin_element* root = NULL;
struct skin_element* last = NULL;
struct skin_element** to_write = 0;
const char* cursor = document; /*Keeps track of location in the document*/
skin_line = 1;
@ -93,14 +89,18 @@ struct skin_element* skin_parse(const char* document)
while(*cursor != '\0')
{
struct skin_element* tree = skin_parse_viewport(&cursor);
if(!root)
to_write = &root;
{
root = tree;
last = root;
}
else
to_write = &(last->next);
{
last->next = skin_buffer_to_offset(tree);
last = tree;
}
*to_write = skin_parse_viewport(&cursor);
last = *to_write;
if(!last)
{
skin_free_tree(root); /* Clearing any memory already used */
@ -108,8 +108,8 @@ struct skin_element* skin_parse(const char* document)
}
/* Making sure last is at the end */
while(last->next)
last = last->next;
while(IS_VALID_OFFSET(last->next))
last = skin_buffer_from_offset(last->next);
}
return root;
@ -121,8 +121,6 @@ static struct skin_element* skin_parse_viewport(const char** document)
struct skin_element* root = NULL;
struct skin_element* last = NULL;
struct skin_element* retval = NULL;
tag_recursion_level = 0;
retval = skin_alloc_element();
if (!retval)
@ -132,7 +130,7 @@ static struct skin_element* skin_parse_viewport(const char** document)
retval->line = skin_line;
viewport_line = skin_line;
struct skin_element** to_write = 0;
OFFSETTYPE(struct skin_element*)* children;
const char* cursor = *document; /* Keeps track of location in the document */
const char* bookmark; /* Used when we need to look ahead */
@ -165,8 +163,8 @@ static struct skin_element* skin_parse_viewport(const char** document)
return retval;
}
retval->children_count = 1;
retval->children = skin_alloc_children(1);
if (!retval->children)
children = skin_alloc_children(1);
if (!children)
return NULL;
do
{
@ -212,15 +210,19 @@ static struct skin_element* skin_parse_viewport(const char** document)
}
cursor = bookmark;
if(!root)
to_write = &root;
else
to_write = &(last->next);
if(sublines)
{
*to_write = skin_parse_sublines(&cursor);
last = *to_write;
struct skin_element* out = skin_parse_sublines(&cursor);
if (!root)
{
root = out;
last = root;
}
else
{
last->next = skin_buffer_to_offset(out);
last = out;
}
if(!last)
return NULL;
}
@ -237,15 +239,25 @@ static struct skin_element* skin_parse_viewport(const char** document)
if (check_viewport(cursor))
break;
#endif
*to_write = skin_parse_line(&cursor);
last = *to_write;
struct skin_element* out = skin_parse_line(&cursor);
if (!root)
{
root = out;
last = root;
}
else
{
last->next = skin_buffer_to_offset(out);
last = out;
}
if(!last)
return NULL;
}
/* Making sure last is at the end */
while(last->next)
last = last->next;
while(IS_VALID_OFFSET(last->next))
last = skin_buffer_from_offset(last->next);
if(*cursor == '\n')
{
@ -269,7 +281,8 @@ static struct skin_element* skin_parse_viewport(const char** document)
*document = cursor;
retval->children[0] = root;
children[0] = skin_buffer_to_offset(root);
retval->children = skin_buffer_to_offset(children);
return retval;
}
@ -293,6 +306,7 @@ static struct skin_element* skin_parse_line_optional(const char** document,
struct skin_element* root = NULL;
struct skin_element* current = NULL;
struct skin_element* retval = NULL;
OFFSETTYPE(struct skin_element*)* children = NULL;
/* A wrapper for the line */
retval = skin_alloc_element();
@ -315,8 +329,8 @@ static struct skin_element* skin_parse_line_optional(const char** document,
if(retval->children_count > 0)
{
retval->children = skin_alloc_children(1);
if (!retval->children)
children = skin_alloc_children(1);
if (!children)
return NULL;
}
@ -344,10 +358,11 @@ static struct skin_element* skin_parse_line_optional(const char** document,
/* Allocating memory if necessary */
if(root)
{
current->next = skin_alloc_element();
if (!current->next)
struct skin_element *next = skin_alloc_element();
if (!next)
return NULL;
current = current->next;
current->next = skin_buffer_to_offset(next);
current = next;
}
else
{
@ -384,7 +399,10 @@ static struct skin_element* skin_parse_line_optional(const char** document,
*document = cursor;
if(root)
retval->children[0] = root;
{
children[0] = skin_buffer_to_offset(root);
retval->children = skin_buffer_to_offset(children);
}
return retval;
}
@ -397,6 +415,7 @@ static struct skin_element* skin_parse_sublines_optional(const char** document,
int conditional)
{
struct skin_element* retval;
OFFSETTYPE(struct skin_element*)* children;
const char* cursor = *document;
int sublines = 1;
int i;
@ -405,7 +424,7 @@ static struct skin_element* skin_parse_sublines_optional(const char** document,
if (!retval)
return NULL;
retval->type = LINE_ALTERNATOR;
retval->next = NULL;
retval->next = skin_buffer_to_offset(NULL);
retval->line = skin_line;
/* First we count the sublines */
@ -449,14 +468,16 @@ static struct skin_element* skin_parse_sublines_optional(const char** document,
/* ...and then we parse them */
retval->children_count = sublines;
retval->children = skin_alloc_children(sublines);
if (!retval->children)
children = skin_alloc_children(sublines);
if (!children)
return NULL;
cursor = *document;
for(i = 0; i < sublines; i++)
{
retval->children[i] = skin_parse_line_optional(&cursor, conditional);
children[i] = skin_buffer_to_offset(skin_parse_line_optional(&cursor, conditional));
if (children[i] < 0)
return NULL;
skip_whitespace(&cursor);
if(*cursor != MULTILINESYM && i != sublines - 1)
@ -478,6 +499,7 @@ static struct skin_element* skin_parse_sublines_optional(const char** document,
}
#endif
*document = cursor;
retval->children = skin_buffer_to_offset(children);
return retval;
}
@ -490,13 +512,13 @@ static int skin_parse_tag(struct skin_element* element, const char** document)
char tag_name[3];
char* tag_args;
const struct tag_info *tag;
struct skin_tag_parameter* params = NULL;
int num_args = 1;
int i;
int star = 0; /* Flag for the all-or-none option */
int optional = 0;
tag_recursion_level++;
/* Checking the tag name */
tag_name[0] = cursor[0];
@ -597,8 +619,8 @@ static int skin_parse_tag(struct skin_element* element, const char** document)
cursor = bookmark; /* Restoring the cursor */
element->params_count = num_args;
element->params = skin_alloc_params(num_args, tag_recursion_level<=1);
if (!element->params)
params = skin_alloc_params(num_args);
if (!params)
return 0;
/* Now we have to actually parse each argument */
@ -686,14 +708,14 @@ static int skin_parse_tag(struct skin_element* element, const char** document)
else
type_code = *tag_args;
/* Storing the type code */
element->params[i].type_code = type_code;
params[i].type_code = type_code;
/* Checking a nullable argument for null. */
if(*cursor == DEFAULTSYM && !isdigit(cursor[1]))
{
if(islower(type_code))
{
element->params[i].type = DEFAULT;
params[i].type = DEFAULT;
cursor++;
}
else
@ -711,8 +733,8 @@ static int skin_parse_tag(struct skin_element* element, const char** document)
return 0;
}
element->params[i].type = INTEGER;
element->params[i].data.number = scan_int(&cursor);
params[i].type = INTEGER;
params[i].data.number = scan_int(&cursor);
}
else if(tolower(type_code) == 'd')
{
@ -738,23 +760,23 @@ static int skin_parse_tag(struct skin_element* element, const char** document)
}
if (have_tenth == false)
val *= 10;
element->params[i].type = DECIMAL;
element->params[i].data.number = val;
params[i].type = DECIMAL;
params[i].data.number = val;
}
else if(tolower(type_code) == 'n' ||
tolower(type_code) == 's' || tolower(type_code) == 'f')
{
/* Scanning a string argument */
element->params[i].type = STRING;
element->params[i].data.text = scan_string(&cursor);
params[i].type = STRING;
params[i].data.text = skin_buffer_to_offset(scan_string(&cursor));
}
else if(tolower(type_code) == 'c')
{
/* Recursively parsing a code argument */
element->params[i].type = CODE;
element->params[i].data.code = skin_parse_code_as_arg(&cursor);
if(!element->params[i].data.code)
params[i].type = CODE;
params[i].data.code = skin_buffer_to_offset(skin_parse_code_as_arg(&cursor));
if(params[i].data.code < 0)
return 0;
}
else if (tolower(type_code) == 't')
@ -763,9 +785,9 @@ static int skin_parse_tag(struct skin_element* element, const char** document)
child->type = TAG;
if (!skin_parse_tag(child, &cursor))
return 0;
child->next = NULL;
element->params[i].type = CODE;
element->params[i].data.code = child;
child->next = skin_buffer_to_offset(NULL);
params[i].type = CODE;
params[i].data.code = skin_buffer_to_offset(child);
}
@ -796,6 +818,7 @@ static int skin_parse_tag(struct skin_element* element, const char** document)
tag_args++;
}
}
element->params = skin_buffer_to_offset(params);
/* Checking for a premature end */
if(*tag_args != '\0' && !optional)
@ -811,7 +834,6 @@ static int skin_parse_tag(struct skin_element* element, const char** document)
}
#endif
*document = cursor;
tag_recursion_level--;
return 1;
}
@ -855,9 +877,10 @@ static int skin_parse_text(struct skin_element* element, const char** document,
/* Copying the text into the element struct */
element->type = TEXT;
element->line = skin_line;
element->next = NULL;
element->data = text = skin_alloc_string(length);
if (!element->data)
element->next = skin_buffer_to_offset(NULL);
text = skin_alloc_string(length);
element->data = skin_buffer_to_offset(text);
if (element->data < 0)
return 0;
for(dest = 0; dest < length; dest++)
@ -896,6 +919,7 @@ static int skin_parse_conditional(struct skin_element* element, const char** doc
const char *false_branch = NULL;
const char *conditional_end = NULL;
#endif
OFFSETTYPE(struct skin_element*)* children_array = NULL;
/* Some conditional tags allow for target feature checking,
* so to handle that call the callback as usual with type == TAG
@ -994,23 +1018,23 @@ static int skin_parse_conditional(struct skin_element* element, const char** doc
{
const char* emptyline= "";
children = 1;
element->children = skin_alloc_children(children);
if (!element->children)
children_array = skin_alloc_children(children);
if (!children_array)
return 0;
element->children_count = children;
element->children[0] = skin_parse_code_as_arg(&emptyline);
children_array[0] = skin_buffer_to_offset(skin_parse_code_as_arg(&emptyline));
}
else
{
element->children = skin_alloc_children(children);
if (!element->children)
children_array = skin_alloc_children(children);
if (!children_array)
return 0;
element->children_count = children;
for(i = 0; i < children; i++)
{
element->children[i] = skin_parse_code_as_arg(&cursor);
if (element->children[i] == NULL)
children_array[i] = skin_buffer_to_offset(skin_parse_code_as_arg(&cursor));
if (children_array[i] < 0)
return 0;
skip_whitespace(&cursor);
#ifdef ROCKBOX
@ -1035,6 +1059,7 @@ static int skin_parse_conditional(struct skin_element* element, const char** doc
}
}
*document = cursor;
element->children = skin_buffer_to_offset(children_array);
return 1;
}
@ -1056,7 +1081,7 @@ static int skin_parse_comment(struct skin_element* element, const char** documen
element->type = COMMENT;
element->line = skin_line;
#ifdef ROCKBOX
element->data = NULL;
element->data = INVALID_OFFSET;
#else
element->data = text = skin_alloc_string(length);
if (!element->data)
@ -1122,7 +1147,6 @@ static struct skin_element* skin_parse_code_as_arg(const char** document)
return skin_parse_line_optional(document, 1);
}
/* Memory management */
struct skin_element* skin_alloc_element()
{
@ -1131,10 +1155,12 @@ struct skin_element* skin_alloc_element()
if (!retval)
return NULL;
retval->type = UNKNOWN;
retval->next = NULL;
retval->next = skin_buffer_to_offset(NULL);
retval->params = skin_buffer_to_offset(NULL);
retval->tag = NULL;
retval->params_count = 0;
retval->children_count = 0;
retval->data = INVALID_OFFSET;
return retval;
@ -1144,16 +1170,8 @@ struct skin_element* skin_alloc_element()
* enough for any tag. params should be used straight away by the callback
* so this is safe.
*/
struct skin_tag_parameter* skin_alloc_params(int count, bool use_shared_params)
struct skin_tag_parameter* skin_alloc_params(int count)
{
#ifdef ROCKBOX
static struct skin_tag_parameter params[MAX_TAG_PARAMS];
if (use_shared_params && count <= MAX_TAG_PARAMS)
{
memset(params, 0, sizeof(params));
return params;
}
#endif
size_t size = sizeof(struct skin_tag_parameter) * count;
return (struct skin_tag_parameter*)skin_buffer_alloc(size);
@ -1164,9 +1182,9 @@ char* skin_alloc_string(int length)
return (char*)skin_buffer_alloc(sizeof(char) * (length + 1));
}
struct skin_element** skin_alloc_children(int count)
OFFSETTYPE(struct skin_element*)* skin_alloc_children(int count)
{
return (struct skin_element**)
return (OFFSETTYPE(struct skin_element*)*)
skin_buffer_alloc(sizeof(struct skin_element*) * count);
}

View file

@ -29,6 +29,25 @@ extern "C"
#include <stdlib.h>
#include <stdbool.h>
#if defined(ROCKBOX) && !defined(__PCTOOL__)
/* Use this type and macro to convert a pointer from the
* skin buffer to a useable pointer */
typedef long skinoffset_t;
#define SKINOFFSETTOPTR(base, offset) ((offset) < 0 ? NULL : ((void*)&base[offset]))
#define PTRTOSKINOFFSET(base, pointer) ((pointer) ? ((void*)pointer-(void*)base) : -1)
/* Use this macro when declaring a variable to self-document the code.
* type is the actual type being pointed to (i.e OFFSETTYPE(char*) foo )
*
* WARNING: Don't use the PTRTOSKINOFFSET() around a function call as it wont
* do what you expect.
*/
#define OFFSETTYPE(type) skinoffset_t
#else
#define SKINOFFSETTOPTR(base, offset) offset
#define PTRTOSKINOFFSET(base, pointer) pointer
#define OFFSETTYPE(type) type
#endif
/********************************************************************
****** Data Structures *********************************************
*******************************************************************/
@ -78,8 +97,8 @@ struct skin_tag_parameter
union
{
int number;
char* text;
struct skin_element* code;
OFFSETTYPE(char*) text;
OFFSETTYPE(struct skin_element*) code;
} data;
char type_code;
@ -92,20 +111,20 @@ struct skin_tag_parameter
struct skin_element
{
/* Link to the next element */
struct skin_element* next;
OFFSETTYPE(struct skin_element*) next;
/* Pointer to an array of children */
struct skin_element** children;
OFFSETTYPE(struct skin_element**) children;
/* Placeholder for element data
* TEXT and COMMENT uses it for the text string
* TAG, VIEWPORT, LINE, etc may use it for post parse extra storage
*/
void* data;
OFFSETTYPE(void*) data;
/* The tag or conditional name */
const struct tag_info *tag;
/* Pointer to an array of parameters */
struct skin_tag_parameter* params;
OFFSETTYPE(struct skin_tag_parameter*) params;
/* Number of elements in the children array */
short children_count;
@ -140,8 +159,8 @@ struct skin_element* skin_parse(const char* document);
#endif
/* Memory management functions */
struct skin_element* skin_alloc_element(void);
struct skin_element** skin_alloc_children(int count);
struct skin_tag_parameter* skin_alloc_params(int count, bool use_shared_params);
OFFSETTYPE(struct skin_element*)* skin_alloc_children(int count);
struct skin_tag_parameter* skin_alloc_params(int count);
char* skin_alloc_string(int length);
void skin_free_tree(struct skin_element* root);

View file

@ -37,6 +37,7 @@
bool debug_wps = true;
int wps_verbose_level = 0;
char *skin_buffer;
int errno;
@ -252,8 +253,6 @@ int main(int argc, char **argv)
struct wps_data wps={0};
enum screen_type screen = SCREEN_MAIN;
struct screen* wps_screen;
char* buffer = NULL;
/* No arguments -> print the help text
* Also print the help text upon -h or --help */
@ -278,14 +277,14 @@ int main(int argc, char **argv)
wps_verbose_level++;
}
}
buffer = malloc(SKIN_BUFFER_SIZE);
if (!buffer)
skin_buffer = malloc(SKIN_BUFFER_SIZE);
if (!skin_buffer)
{
printf("mallloc fail!\n");
return 1;
}
skin_buffer_init(buffer, SKIN_BUFFER_SIZE);
skin_buffer_init(skin_buffer, SKIN_BUFFER_SIZE);
/* Go through every skin that was thrown at us, error out at the first
* flawed wps */
@ -311,7 +310,7 @@ int main(int argc, char **argv)
printf("WPS parsed OK\n\n");
if (wps_verbose_level>2)
skin_debug_tree(wps.tree);
skin_debug_tree(SKINOFFSETTOPTR(skin_buffer, wps.tree));
filearg++;
}
return 0;