diff options
author | Jonathan Gordon <rockbox@jdgordon.info> | 2012-03-15 11:58:38 +1100 |
---|---|---|
committer | Jonathan Gordon <rockbox@jdgordon.info> | 2012-07-29 04:24:38 +0200 |
commit | 9dd2eb49bec19de06c5cfd168a0e4cd4dc44c867 (patch) | |
tree | 6dd6681902122f3a002251787f2067a68f0ceaa7 /lib/skin_parser/skin_parser.c | |
parent | 9a84bcfe4b9821c68322a1a91da9f16d0bd2a4bc (diff) | |
download | rockbox-9dd2eb49bec19de06c5cfd168a0e4cd4dc44c867.tar.gz rockbox-9dd2eb49bec19de06c5cfd168a0e4cd4dc44c867.zip |
skin_engine: Support percentages for viewport positioning
%V(0,50%,75%,50%,-) - make a viewport at x=0, y=half the lcd height,
75% lcd width and the remaining height (the other half) of the lcd.
Change-Id: If26ccb65e8dc52c9225f3fd6d7b222d770add0f0
Reviewed-on: http://gerrit.rockbox.org/184
Reviewed-by: Thomas Martitz <kugel@rockbox.org>
Tested-by: Thomas Martitz <kugel@rockbox.org>
Reviewed-by: Jonathan Gordon <rockbox@jdgordon.info>
Diffstat (limited to 'lib/skin_parser/skin_parser.c')
-rw-r--r-- | lib/skin_parser/skin_parser.c | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/lib/skin_parser/skin_parser.c b/lib/skin_parser/skin_parser.c index 748ea5da22..1f4b87a328 100644 --- a/lib/skin_parser/skin_parser.c +++ b/lib/skin_parser/skin_parser.c | |||
@@ -568,7 +568,7 @@ static int skin_parse_tag(struct skin_element* element, const char** document) | |||
568 | while(*cursor != '\n' && *cursor != '\0' && *cursor != ARGLISTCLOSESYM) | 568 | while(*cursor != '\n' && *cursor != '\0' && *cursor != ARGLISTCLOSESYM) |
569 | { | 569 | { |
570 | /* Skipping over escaped characters */ | 570 | /* Skipping over escaped characters */ |
571 | if(*cursor == TAGSYM) | 571 | if(*cursor == TAGSYM && *(cursor+1) != ARGLISTSEPARATESYM) |
572 | { | 572 | { |
573 | skip_tag(&cursor); | 573 | skip_tag(&cursor); |
574 | } | 574 | } |
@@ -625,7 +625,7 @@ static int skin_parse_tag(struct skin_element* element, const char** document) | |||
625 | * default > decimal/integer > single tag/code > string | 625 | * default > decimal/integer > single tag/code > string |
626 | */ | 626 | */ |
627 | int j=0; | 627 | int j=0; |
628 | bool canbedefault = false; | 628 | bool canbedefault = false, last_char_is_percent = false; |
629 | bool haspercent = false, number = true, hasdecimal = false; | 629 | bool haspercent = false, number = true, hasdecimal = false; |
630 | char temp_params[8]; | 630 | char temp_params[8]; |
631 | open_square_bracket = tag_args; | 631 | open_square_bracket = tag_args; |
@@ -644,9 +644,11 @@ static int skin_parse_tag(struct skin_element* element, const char** document) | |||
644 | hasdecimal = hasdecimal || (cursor[j] == '.'); | 644 | hasdecimal = hasdecimal || (cursor[j] == '.'); |
645 | number = number && (isdigit(cursor[j]) || | 645 | number = number && (isdigit(cursor[j]) || |
646 | (cursor[j] == '.') || | 646 | (cursor[j] == '.') || |
647 | (cursor[j] == '-')); | 647 | (cursor[j] == '-') || |
648 | (cursor[j] == '%')); | ||
648 | j++; | 649 | j++; |
649 | } | 650 | } |
651 | last_char_is_percent = cursor[j-1] == '%'; | ||
650 | type_code = '?'; | 652 | type_code = '?'; |
651 | if (canbedefault && *cursor == DEFAULTSYM && !isdigit(cursor[1])) | 653 | if (canbedefault && *cursor == DEFAULTSYM && !isdigit(cursor[1])) |
652 | { | 654 | { |
@@ -656,6 +658,10 @@ static int skin_parse_tag(struct skin_element* element, const char** document) | |||
656 | { | 658 | { |
657 | type_code = 'd'; | 659 | type_code = 'd'; |
658 | } | 660 | } |
661 | else if (number && last_char_is_percent && strchr(temp_params, 'p')) | ||
662 | { | ||
663 | type_code = 'p'; | ||
664 | } | ||
659 | else if (number && | 665 | else if (number && |
660 | (strchr(temp_params, 'i') || strchr(temp_params, 'd'))) | 666 | (strchr(temp_params, 'i') || strchr(temp_params, 'd'))) |
661 | { | 667 | { |
@@ -707,7 +713,7 @@ static int skin_parse_tag(struct skin_element* element, const char** document) | |||
707 | params[i].type = INTEGER; | 713 | params[i].type = INTEGER; |
708 | params[i].data.number = scan_int(&cursor); | 714 | params[i].data.number = scan_int(&cursor); |
709 | } | 715 | } |
710 | else if(tolower(type_code) == 'd') | 716 | else if(tolower(type_code) == 'd' || tolower(type_code) == 'p') |
711 | { | 717 | { |
712 | int val = 0; | 718 | int val = 0; |
713 | bool have_point = false; | 719 | bool have_point = false; |
@@ -731,7 +737,13 @@ static int skin_parse_tag(struct skin_element* element, const char** document) | |||
731 | } | 737 | } |
732 | if (have_tenth == false) | 738 | if (have_tenth == false) |
733 | val *= 10; | 739 | val *= 10; |
734 | params[i].type = DECIMAL; | 740 | if (tolower(type_code) == 'd') |
741 | params[i].type = DECIMAL; | ||
742 | else | ||
743 | { | ||
744 | params[i].type = PERCENT; | ||
745 | cursor++; /* skip trailing % sign */ | ||
746 | } | ||
735 | params[i].data.number = val; | 747 | params[i].data.number = val; |
736 | } | 748 | } |
737 | else if(tolower(type_code) == 's' || tolower(type_code) == 'f') | 749 | else if(tolower(type_code) == 's' || tolower(type_code) == 'f') |