OSDN Git Service

e9fd46d025667333da36a24a5d797b0374e88a04
[bbk/bchanf.git] / src / tad / tadstack.c
1 /*
2  * tadstack.c
3  *
4  * Copyright (c) 2012 project bchan
5  *
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.
9  *
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:
13  *
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.
18  *
19  * 2. Altered source versions must be plainly marked as such, and must not be
20  *    misrepresented as being the original software.
21  *
22  * 3. This notice may not be removed or altered from any source
23  *    distribution.
24  *
25  */
26
27 #include "tadstack.h"
28
29 #include        <basic.h>
30 #include        <bstdio.h>
31 #include        <tad.h>
32
33 EXPORT W tadstack_nestlevel(tadstack_t *stack)
34 {
35         return stack->nestlevel;
36 }
37
38 EXPORT VOID tadstack_currentlang(tadstack_t *stack, TC **lang, W *len)
39 {
40         if (stack->data[stack->nestlevel].type != TADSTACK_DATATYPE_TEXT) {
41                 *lang = NULL;
42                 *len = 0;
43                 return;
44         }
45         *lang = stack->data[stack->nestlevel].currentlang;
46         *len = 1;
47 }
48
49 EXPORT TADSTACK_DATATYPE tadstack_currentdata(tadstack_t *stack)
50 {
51         return stack->data[stack->nestlevel].type;
52 }
53
54 EXPORT RECT tadstack_currentview(tadstack_t *stack)
55 {
56         return stack->data[stack->nestlevel].view;
57 }
58
59 EXPORT RECT tadstack_currentdraw(tadstack_t *stack)
60 {
61         return stack->data[stack->nestlevel].draw;
62 }
63
64 EXPORT UNITS tadstack_currenthunit(tadstack_t *stack)
65 {
66         return stack->data[stack->nestlevel].h_unit;
67 }
68
69 EXPORT UNITS tadstack_currentvunit(tadstack_t *stack)
70 {
71         return stack->data[stack->nestlevel].v_unit;
72 }
73
74 LOCAL VOID tadstack_pushTEXTstack(tadstack_t *stack, RECT view, RECT draw, UNITS h_unit, UNITS v_unit, UH lang, UH bgpat)
75 {
76         stack->nestlevel++;
77
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;
86 }
87
88 LOCAL VOID tadstack_pushFIGstack(tadstack_t *stack, RECT view, RECT draw, UNITS h_unit, UNITS v_unit, W ratio)
89 {
90         stack->nestlevel++;
91
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;
98 }
99
100 LOCAL VOID tadstack_popstack(tadstack_t *stack)
101 {
102         stack->nestlevel--;
103 }
104
105 EXPORT TADSTACK_RESULT tadstack_inputcharactor(tadstack_t *stack, TC ch)
106 {
107         TADSTACK_RESULT ret = TADSTACK_RESULT_OK;
108
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;
114                 break;
115         case TADSTACK_STATE_TEXT:
116                 if ((ch & 0xFE00) == 0xFE00) {
117                         stack->data[stack->nestlevel].currentlang[0] = ch;
118                         ret = TADSTACK_RESULT_LANGUAGE_CHANGE;
119                         if (ch == 0xFEFE) {
120                                 stack->state = TADSTACK_STATE_TEXT_LANGCODE;
121                         }
122                         break;
123                 }
124                 ret = TADSTACK_RESULT_OK;
125                 break;
126         case TADSTACK_STATE_TEXT_LANGCODE:
127                 if ((ch & 0xFE00) != 0xFE00) {
128                         ret = TADSTACK_RESULT_FORMAT_ERROR;
129                         break;
130                 }
131                 if (ch != 0xFEFE) {
132                         stack->state = TADSTACK_STATE_TEXT;
133                 }
134                 ret = TADSTACK_RESULT_OK;
135                 break;
136         case TADSTACK_STATE_FIG:
137                 return TADSTACK_RESULT_FORMAT_ERROR;
138         }
139
140         return ret;
141 }
142
143 LOCAL TADSTACK_RESULT tadstack_handle_textsegment(tadstack_t *stack, UB *bin, W len)
144 {
145         TEXTSEG *textseg;
146
147         if (len < 24) {
148                 return TADSTACK_RESULT_FORMAT_ERROR;
149         }
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;
153
154         return TADSTACK_RESULT_PUSH_STACK;
155 }
156
157 LOCAL TADSTACK_RESULT tadstack_handle_figsegment(tadstack_t *stack, UB *bin, W len)
158 {
159         FIGSEG *figseg;
160
161         if (len < 24) {
162                 return TADSTACK_RESULT_FORMAT_ERROR;
163         }
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;
167
168         return TADSTACK_RESULT_PUSH_STACK;
169 }
170
171 EXPORT TADSTACK_RESULT tadstack_inputvsegment(tadstack_t *stack, UH segid, UB *bin, W len)
172 {
173         TADSTACK_RESULT ret = TADSTACK_RESULT_OK;
174
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;
185                 } else {
186                         ret = TADSTACK_RESULT_OK;
187                 }
188                 break;
189           case TADSTACK_STATE_TEXT:
190                 if ((TS_FPRIM <= segid)&&(segid <= TS_FAPPL)) {
191                         ret = TADSTACK_RESULT_FORMAT_ERROR;
192                         break;
193                 }
194                 if (segid == TS_TEXT) {
195                         ret = tadstack_handle_textsegment(stack, bin, len);
196                         break;
197                 }
198                 if (segid == TS_FIG) {
199                         ret = tadstack_handle_figsegment(stack, bin, len);
200                         break;
201                 }
202                 if (segid == TS_FIGEND) {
203                         ret = TADSTACK_RESULT_FORMAT_ERROR;
204                         break;
205                 }
206                 if (segid == TS_TEXTEND) {
207                         tadstack_popstack(stack);
208                         ret = TADSTACK_RESULT_POP_STACK;
209                         break;
210                 }
211                 ret = TADSTACK_RESULT_OK;
212                 break;
213           case TADSTACK_STATE_TEXT_LANGCODE:
214                 ret = TADSTACK_RESULT_FORMAT_ERROR;
215                 break;
216           case TADSTACK_STATE_FIG:
217                 if ((0xA0 <= segid)&&(segid <= 0xAF)) {
218                         ret = TADSTACK_RESULT_FORMAT_ERROR;
219                         break;
220                 }
221                 if (segid == TS_TEXT) {
222                         ret = tadstack_handle_textsegment(stack, bin, len);
223                         break;
224                 }
225                 if (segid == TS_FIG) {
226                         ret = tadstack_handle_figsegment(stack, bin, len);
227                         break;
228                 }
229                 if (segid == TS_TEXTEND) {
230                         ret = TADSTACK_RESULT_FORMAT_ERROR;
231                         break;
232                 }
233                 if (segid == TS_FIGEND) {
234                         tadstack_popstack(stack);
235                         ret = TADSTACK_RESULT_POP_STACK;
236                         break;
237                 }
238                 ret = TADSTACK_RESULT_OK;
239                 break;
240         }
241
242         return ret;
243 }
244
245 EXPORT VOID tadstack_initialize(tadstack_t *stack)
246 {
247         stack->state = TADSTACK_STATE_START;
248         stack->nestlevel = -1;
249 }
250
251 EXPORT VOID tadstack_finalize(tadstack_t *stack)
252 {
253 }