summaryrefslogtreecommitdiff
path: root/utils/newparser/skin_render.c
diff options
context:
space:
mode:
authorJonathan Gordon <rockbox@jdgordon.info>2010-06-13 13:54:34 +0000
committerJonathan Gordon <rockbox@jdgordon.info>2010-06-13 13:54:34 +0000
commit21cbdac55fc0894dba81cd3d81ba3eba86d1c60e (patch)
treea00da2dd847b18036e12ee717b0fc90fccdfbb24 /utils/newparser/skin_render.c
parent93460f50ba07a00f60105706b54bf6264309f109 (diff)
downloadrockbox-21cbdac55fc0894dba81cd3d81ba3eba86d1c60e.tar.gz
rockbox-21cbdac55fc0894dba81cd3d81ba3eba86d1c60e.zip
get the renderer working more better! "handle" sublines correctly, dont "draw" in the first viewport if we are using viewports, get rid of the idea of a linear token array (i.e we are going to use the parse tree directly)
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@26831 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'utils/newparser/skin_render.c')
-rw-r--r--utils/newparser/skin_render.c65
1 files changed, 48 insertions, 17 deletions
diff --git a/utils/newparser/skin_render.c b/utils/newparser/skin_render.c
index e71a867130..03324665a1 100644
--- a/utils/newparser/skin_render.c
+++ b/utils/newparser/skin_render.c
@@ -22,25 +22,37 @@
22#include <stdlib.h> 22#include <stdlib.h>
23#include <stdio.h> 23#include <stdio.h>
24#include <string.h> 24#include <string.h>
25#include <stdbool.h>
25#include <ctype.h> 26#include <ctype.h>
27#include <string.h>
26 28
27#include "skin_parser.h" 29#include "skin_parser.h"
28#include "skin_debug.h" 30#include "skin_debug.h"
29#include "tag_table.h" 31#include "tag_table.h"
30#include "symbols.h" 32#include "symbols.h"
31#include "skin_scan.h" 33#include "skin_scan.h"
34#include "skin_structs.h"
35
36#define MAX_LINE 1024
32 37
33void skin_render_alternator(struct skin_element* alternator, int line_number); 38typedef void (*skin_render_func)(struct skin_element* alternator,
39 char* buf, size_t buf_size, int line_number);
40void skin_render_alternator(struct skin_element* alternator,
41 char* buf, size_t buf_size, int line_number);
34 42
35/* Draw a LINE element onto the display */ 43/* Draw a LINE element onto the display */
36void skin_render_line(struct skin_element* line, int line_number) 44void skin_render_line(struct skin_element* line,
45 char* buf, size_t buf_size, int line_number)
37{ 46{
38 int i=0, value; 47 int value;
39 if (line->children_count == 0) 48 if (line->children_count == 0)
40 return; /* empty line, do nothing */ 49 return; /* empty line, do nothing */
41 struct skin_element *child = line->children[0]; 50 struct skin_element *child = line->children[0];
51 skin_render_func func = skin_render_line;
52 char tempbuf[128];
42 while (child) 53 while (child)
43 { 54 {
55 tempbuf[0] = '\0';
44 switch (child->type) 56 switch (child->type)
45 { 57 {
46 case CONDITIONAL: 58 case CONDITIONAL:
@@ -48,41 +60,58 @@ void skin_render_line(struct skin_element* line, int line_number)
48 if (value >= child->children_count) 60 if (value >= child->children_count)
49 value = child->children_count-1; 61 value = child->children_count-1;
50 if (child->children[value]->type == SUBLINES) 62 if (child->children[value]->type == SUBLINES)
51 skin_render_alternator(child->children[value], line_number); 63 func = skin_render_alternator;
52 else if (child->children[value]->type == LINE) 64 else if (child->children[value]->type == LINE)
53 skin_render_line(child->children[value], line_number); 65 func = skin_render_line;
66 func(child->children[value], buf, buf_size, line_number);
54 break; 67 break;
55 case TAG: 68 case TAG:
56 printf("%%%s", child->tag->name); 69 snprintf(tempbuf, sizeof(tempbuf), "%%%s", child->tag->name);
57 break; 70 break;
58 case TEXT: 71 case TEXT:
59 printf("%s", (char*)(child->data)); 72 snprintf(tempbuf, sizeof(tempbuf), "%s", (char*)(child->data));
60 break; 73 break;
61 case COMMENT: 74 case COMMENT:
62 default: 75 default:
63 break; 76 break;
64 } 77 }
78 strcat(buf, tempbuf);
65 child = child->next; 79 child = child->next;
66 } 80 }
67} 81}
68 82#define TIME_AFTER(a,b) 1
69void skin_render_alternator(struct skin_element* alternator, int line_number) 83void skin_render_alternator(struct skin_element* alternator,
84 char* buf, size_t buf_size, int line_number)
70{ 85{
71 /*TODO Choose which subline to draw */ 86 struct subline *subline = (struct subline*)alternator->data;
72 skin_render_line(alternator->children[0], line_number); 87 if (TIME_AFTER(subline->last_change_tick + subline->timeout, 0/*FIXME*/))
88 {
89 subline->current_line++;
90 if (subline->current_line >= alternator->children_count)
91 subline->current_line = 0;
92 }
93 skin_render_line(alternator->children[subline->current_line],
94 buf, buf_size, line_number);
73} 95}
74 96
75void skin_render_viewport(struct skin_element* viewport) 97void skin_render_viewport(struct skin_element* line, bool draw_tags)
76{ 98{
77 struct skin_element *line = viewport;
78 int line_number = 0; 99 int line_number = 0;
100 char linebuf[MAX_LINE];
101 skin_render_func func = skin_render_line;
79 while (line) 102 while (line)
80 { 103 {
81 printf("\n[%d]", line_number); /* might be incorrect */ 104 linebuf[0] = '\0';
82 if (line->type == SUBLINES) 105 if (line->type == SUBLINES)
83 skin_render_alternator(line, line_number); 106 func = skin_render_alternator;
84 else if (line->type == LINE) 107 else if (line->type == LINE)
85 skin_render_line(line, line_number); 108 func = skin_render_line;
109
110 func (line, linebuf, sizeof(linebuf), line_number);
111 if (draw_tags)
112 {
113 printf("%s\n", linebuf);
114 }
86 line_number++; 115 line_number++;
87 line = line->next; 116 line = line->next;
88 } 117 }
@@ -91,9 +120,11 @@ void skin_render_viewport(struct skin_element* viewport)
91void skin_render(struct skin_element* root) 120void skin_render(struct skin_element* root)
92{ 121{
93 struct skin_element* viewport = root; 122 struct skin_element* viewport = root;
123 bool draw_tags = viewport->next ? false : true;
94 while (viewport) 124 while (viewport)
95 { 125 {
96 skin_render_viewport(viewport->children[0]); 126 skin_render_viewport(viewport->children[0], draw_tags);
127 draw_tags = true;
97 viewport = viewport->next; 128 viewport = viewport->next;
98 } 129 }
99} 130}