4 * Copyright (c) 2012 project bchan
6 * This software is provided 'as-is', without any express or implied
7 * warranty. In no event will the authors be held liable for any damages
8 * arising from the use of this software.
10 * Permission is granted to anyone to use this software for any purpose,
11 * including commercial applications, and to alter it and redistribute it
12 * freely, subject to the following restrictions:
14 * 1. The origin of this software must not be misrepresented; you must not
15 * claim that you wrote the original software. If you use this software
16 * in a product, an acknowledgment in the product documentation would be
17 * appreciated but is not required.
19 * 2. Altered source versions must be plainly marked as such, and must not be
20 * misrepresented as being the original software.
22 * 3. This notice may not be removed or altered from any source
33 EXPORT W tadstack_nestlevel(tadstack_t *stack)
35 return stack->nestlevel;
38 EXPORT VOID tadstack_currentlang(tadstack_t *stack, TC **lang, W *len)
40 if (stack->data[stack->nestlevel].type != TADSTACK_DATATYPE_TEXT) {
45 *lang = stack->data[stack->nestlevel].currentlang;
49 EXPORT TADSTACK_DATATYPE tadstack_currentdata(tadstack_t *stack)
51 return stack->data[stack->nestlevel].type;
54 EXPORT RECT tadstack_currentview(tadstack_t *stack)
56 return stack->data[stack->nestlevel].view;
59 EXPORT RECT tadstack_currentdraw(tadstack_t *stack)
61 return stack->data[stack->nestlevel].draw;
64 EXPORT UNITS tadstack_currenthunit(tadstack_t *stack)
66 return stack->data[stack->nestlevel].h_unit;
69 EXPORT UNITS tadstack_currentvunit(tadstack_t *stack)
71 return stack->data[stack->nestlevel].v_unit;
74 LOCAL VOID tadstack_pushTEXTstack(tadstack_t *stack, RECT view, RECT draw, UNITS h_unit, UNITS v_unit, UH lang, UH bgpat)
78 stack->data[stack->nestlevel].type = TADSTACK_DATATYPE_TEXT;
79 stack->data[stack->nestlevel].view = view;
80 stack->data[stack->nestlevel].draw = draw;
81 stack->data[stack->nestlevel].h_unit = h_unit;
82 stack->data[stack->nestlevel].v_unit = v_unit;
83 stack->data[stack->nestlevel].lang = lang;
84 stack->data[stack->nestlevel].bgpat = bgpat;
85 stack->data[stack->nestlevel].currentlang[0] = lang;
88 LOCAL VOID tadstack_pushFIGstack(tadstack_t *stack, RECT view, RECT draw, UNITS h_unit, UNITS v_unit, W ratio)
92 stack->data[stack->nestlevel].type = TADSTACK_DATATYPE_FIG;
93 stack->data[stack->nestlevel].view = view;
94 stack->data[stack->nestlevel].draw = draw;
95 stack->data[stack->nestlevel].h_unit = h_unit;
96 stack->data[stack->nestlevel].v_unit = v_unit;
97 stack->data[stack->nestlevel].ratio = ratio;
100 LOCAL VOID tadstack_popstack(tadstack_t *stack)
105 EXPORT TADSTACK_RESULT tadstack_inputcharactor(tadstack_t *stack, TC ch)
107 TADSTACK_RESULT ret = TADSTACK_RESULT_OK;
109 switch (stack->state) {
110 case TADSTACK_STATE_START:
111 tadstack_pushTEXTstack(stack, (RECT){{0, 0, 0, 0}}, (RECT){{0, 0, 0, 0}}, 0, 0, 0x21, 0);
112 stack->state = TADSTACK_STATE_TEXT;
113 ret = TADSTACK_RESULT_PUSH_STACK;
115 case TADSTACK_STATE_TEXT:
116 if ((ch & 0xFE00) == 0xFE00) {
117 stack->data[stack->nestlevel].currentlang[0] = ch;
118 ret = TADSTACK_RESULT_LANGUAGE_CHANGE;
120 stack->state = TADSTACK_STATE_TEXT_LANGCODE;
124 ret = TADSTACK_RESULT_OK;
126 case TADSTACK_STATE_TEXT_LANGCODE:
127 if ((ch & 0xFE00) != 0xFE00) {
128 ret = TADSTACK_RESULT_FORMAT_ERROR;
132 stack->state = TADSTACK_STATE_TEXT;
134 ret = TADSTACK_RESULT_OK;
136 case TADSTACK_STATE_FIG:
137 return TADSTACK_RESULT_FORMAT_ERROR;
143 LOCAL TADSTACK_RESULT tadstack_handle_textsegment(tadstack_t *stack, UB *bin, W len)
148 return TADSTACK_RESULT_FORMAT_ERROR;
150 textseg = (TEXTSEG*)bin;
151 tadstack_pushTEXTstack(stack, textseg->view, textseg->draw, textseg->h_unit, textseg->v_unit, textseg->lang, textseg->bgpat);
152 stack->state = TADSTACK_STATE_TEXT;
154 return TADSTACK_RESULT_PUSH_STACK;
157 LOCAL TADSTACK_RESULT tadstack_handle_figsegment(tadstack_t *stack, UB *bin, W len)
162 return TADSTACK_RESULT_FORMAT_ERROR;
164 figseg = (FIGSEG*)bin;
165 tadstack_pushFIGstack(stack, figseg->view, figseg->draw, figseg->h_unit, figseg->v_unit, figseg->ratio);
166 stack->state = TADSTACK_STATE_FIG;
168 return TADSTACK_RESULT_PUSH_STACK;
171 EXPORT TADSTACK_RESULT tadstack_inputvsegment(tadstack_t *stack, UH segid, UB *bin, W len)
173 TADSTACK_RESULT ret = TADSTACK_RESULT_OK;
175 switch (stack->state) {
176 case TADSTACK_STATE_START:
177 if (segid == TS_TEXT) {
178 ret = tadstack_handle_textsegment(stack, bin, len);
179 } else if (segid == TS_FIG) {
180 ret = tadstack_handle_figsegment(stack, bin, len);
181 } else if ((TS_FPRIM <= segid)&&(segid <= TS_FAPPL)) {
182 tadstack_pushFIGstack(stack, (RECT){{0, 0, 0, 0}}, (RECT){{0, 0, 0, 0}}, 0, 0, 0);
183 stack->state = TADSTACK_STATE_FIG;
184 ret = TADSTACK_RESULT_PUSH_STACK;
186 ret = TADSTACK_RESULT_OK;
189 case TADSTACK_STATE_TEXT:
190 if ((TS_FPRIM <= segid)&&(segid <= TS_FAPPL)) {
191 ret = TADSTACK_RESULT_FORMAT_ERROR;
194 if (segid == TS_TEXT) {
195 ret = tadstack_handle_textsegment(stack, bin, len);
198 if (segid == TS_FIG) {
199 ret = tadstack_handle_figsegment(stack, bin, len);
202 if (segid == TS_FIGEND) {
203 ret = TADSTACK_RESULT_FORMAT_ERROR;
206 if (segid == TS_TEXTEND) {
207 tadstack_popstack(stack);
208 ret = TADSTACK_RESULT_POP_STACK;
211 ret = TADSTACK_RESULT_OK;
213 case TADSTACK_STATE_TEXT_LANGCODE:
214 ret = TADSTACK_RESULT_FORMAT_ERROR;
216 case TADSTACK_STATE_FIG:
217 if ((0xA0 <= segid)&&(segid <= 0xAF)) {
218 ret = TADSTACK_RESULT_FORMAT_ERROR;
221 if (segid == TS_TEXT) {
222 ret = tadstack_handle_textsegment(stack, bin, len);
225 if (segid == TS_FIG) {
226 ret = tadstack_handle_figsegment(stack, bin, len);
229 if (segid == TS_TEXTEND) {
230 ret = TADSTACK_RESULT_FORMAT_ERROR;
233 if (segid == TS_FIGEND) {
234 tadstack_popstack(stack);
235 ret = TADSTACK_RESULT_POP_STACK;
238 ret = TADSTACK_RESULT_OK;
245 EXPORT VOID tadstack_initialize(tadstack_t *stack)
247 stack->state = TADSTACK_STATE_START;
248 stack->nestlevel = -1;
251 EXPORT VOID tadstack_finalize(tadstack_t *stack)