/[public]/psiconv/trunk/lib/psiconv/generate_layout.c
ViewVC logotype

Contents of /psiconv/trunk/lib/psiconv/generate_layout.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 142 - (show annotations)
Tue Jan 29 18:38:38 2002 UTC (22 years, 2 months ago) by frodo
File MIME type: text/plain
File size: 15040 byte(s)
(Frodo) DMALLOC support

1 /*
2 generate_layout.c - Part of psiconv, a PSION 5 file formats converter
3 Copyright (c) 2000 Frodo Looijaard <frodol@dds.nl>
4
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 */
19
20 #include "config.h"
21 #include "compat.h"
22
23 #include "generate_routines.h"
24 #include "error.h"
25
26 #ifdef DMALLOC
27 #include <dmalloc.h>
28 #endif
29
30
31 int psiconv_write_color(psiconv_buffer buf, const psiconv_color value)
32 {
33 int res;
34 if (!value) {
35 psiconv_warn(0,psiconv_buffer_length(buf),"Null color");
36 return -PSICONV_E_GENERATE;
37 }
38 if ((res = psiconv_write_u8(buf,value->red)))
39 return res;
40 if ((res = psiconv_write_u8(buf,value->green)))
41 return res;
42 return psiconv_write_u8(buf,value->blue);
43 }
44
45 int psiconv_write_font(psiconv_buffer buf, const psiconv_font value)
46 {
47 int res,i;
48 if (!value) {
49 psiconv_warn(0,psiconv_buffer_length(buf),"Null font");
50 return -PSICONV_E_GENERATE;
51 }
52 if ((res = psiconv_write_u8(buf,strlen(value->name)+1)))
53 return res;
54 for (i = 0; i < strlen(value->name); i++)
55 if ((res = psiconv_write_u8(buf,value->name[i])))
56 return res;
57 return psiconv_write_u8(buf,value->screenfont);
58 }
59
60 int psiconv_write_border(psiconv_buffer buf, const psiconv_border value)
61 {
62 int res;
63
64 if (!value) {
65 psiconv_warn(0,psiconv_buffer_length(buf),"Null border");
66 return -PSICONV_E_GENERATE;
67 }
68 if (value->kind > psiconv_border_dotdotdashed)
69 psiconv_warn(0,psiconv_buffer_length(buf),
70 "Unknown border kind (%d); assuming none",value->kind);
71 if ((res =psiconv_write_u8(buf,value->kind == psiconv_border_none?0:
72 value->kind == psiconv_border_solid?1:
73 value->kind == psiconv_border_double?2:
74 value->kind == psiconv_border_dotted?3:
75 value->kind == psiconv_border_dashed?4:
76 value->kind == psiconv_border_dotdashed?5:
77 value->kind == psiconv_border_dotdotdashed?6:
78 0)))
79 return res;
80 if ((res = psiconv_write_size(buf,(value->kind == psiconv_border_solid) ||
81 (value->kind == psiconv_border_double) ?
82 value->thickness:1.0/20.0)))
83 return res;
84 if ((res = psiconv_write_color(buf,value->color)))
85 return res;
86 // Unknown byte
87 return psiconv_write_u8(buf,1);
88 }
89
90 int psiconv_write_bullet(psiconv_buffer buf, const psiconv_bullet value)
91 {
92 int res;
93 psiconv_buffer extra_buf;
94 if (!value) {
95 psiconv_warn(0,psiconv_buffer_length(buf),"Null bullet");
96 return -PSICONV_E_GENERATE;
97 }
98
99 if (!(extra_buf = psiconv_buffer_new()))
100 return -PSICONV_E_NOMEM;
101 if ((res = psiconv_write_size(extra_buf,value->font_size)))
102 goto ERROR;
103 if ((res = psiconv_write_u8(extra_buf,value->character)))
104 goto ERROR;
105 if ((res = psiconv_write_bool(extra_buf,value->indent)))
106 goto ERROR;
107 if ((res = psiconv_write_color(extra_buf,value->color)))
108 goto ERROR;
109 if ((res = psiconv_write_font(extra_buf,value->font)))
110 goto ERROR;
111
112 if ((res = psiconv_write_u8(buf,psiconv_buffer_length(extra_buf))))
113 goto ERROR;
114 res = psiconv_buffer_concat(buf,extra_buf);
115
116 ERROR:
117 psiconv_buffer_free(extra_buf);
118 return res;
119 }
120
121 int psiconv_write_tab(psiconv_buffer buf,psiconv_tab value)
122 {
123 int res;
124 if (!value) {
125 psiconv_warn(0,psiconv_buffer_length(buf),"Null tab");
126 return -PSICONV_E_GENERATE;
127 }
128 if ((res = psiconv_write_length(buf,value->location)))
129 return res;
130 if ((value->kind != psiconv_tab_left) &&
131 (value->kind != psiconv_tab_right) &&
132 (value->kind != psiconv_tab_centre))
133 psiconv_warn(0,psiconv_buffer_length(buf),
134 "Unknown tab kind (%d); assuming left",value->kind);
135 return psiconv_write_u8(buf, value->kind == psiconv_tab_right?2:
136 value->kind == psiconv_tab_centre?3:1);
137 }
138
139 int psiconv_write_paragraph_layout_list(psiconv_buffer buf,
140 psiconv_paragraph_layout value,
141 psiconv_paragraph_layout base)
142 {
143 int res,i;
144 psiconv_buffer extra_buf;
145 psiconv_tab tab;
146
147 if (!value) {
148 psiconv_warn(0,psiconv_buffer_length(buf),"Null paragraph layout list");
149 return -PSICONV_E_GENERATE;
150 }
151 if (!(extra_buf = psiconv_buffer_new()))
152 return -PSICONV_E_NOMEM;
153
154 if (!base || psiconv_compare_color(base->back_color,value->back_color)) {
155 if ((res = psiconv_write_u8(extra_buf,0x01)))
156 goto ERROR;
157 if ((res = psiconv_write_color(extra_buf,value->back_color)))
158 goto ERROR;
159 }
160
161 if (!base || (value->indent_left != base->indent_left)) {
162 if ((res = psiconv_write_u8(extra_buf,0x02)))
163 goto ERROR;
164 if ((res = psiconv_write_length(extra_buf,value->indent_left)))
165 goto ERROR;
166 }
167
168 if (!base || (value->indent_right != base->indent_right)) {
169 if ((res = psiconv_write_u8(extra_buf,0x03)))
170 goto ERROR;
171 if ((res = psiconv_write_length(extra_buf,value->indent_right)))
172 goto ERROR;
173 }
174
175 if (!base || (value->indent_first != base->indent_first)) {
176 if ((res = psiconv_write_u8(extra_buf,0x04)))
177 goto ERROR;
178 if ((res = psiconv_write_length(extra_buf,value->indent_first)))
179 goto ERROR;
180 }
181
182 if (!base || (value->justify_hor != base->justify_hor)) {
183 if ((res = psiconv_write_u8(extra_buf,0x05)))
184 goto ERROR;
185 if ((value->justify_hor < psiconv_justify_left) ||
186 (value->justify_hor > psiconv_justify_full))
187 psiconv_warn(0,psiconv_buffer_length(buf),
188 "Unknown horizontal justify (%d); assuming left",
189 value->justify_hor);
190 if ((res = psiconv_write_u8(extra_buf,
191 value->justify_hor == psiconv_justify_centre?1:
192 value->justify_hor == psiconv_justify_right?2:
193 value->justify_hor == psiconv_justify_full?3:0)))
194 goto ERROR;
195 }
196
197 if (!base || (value->justify_ver != base->justify_ver)) {
198 if ((res = psiconv_write_u8(extra_buf,0x06)))
199 goto ERROR;
200 if ((value->justify_ver < psiconv_justify_top) ||
201 (value->justify_ver > psiconv_justify_bottom))
202 psiconv_warn(0,psiconv_buffer_length(buf),
203 "Unknown vertical justify (%d); assuming middle",
204 value->justify_ver);
205 if ((res = psiconv_write_u8(extra_buf,
206 value->justify_ver == psiconv_justify_centre?1:
207 value->justify_ver == psiconv_justify_right?2:0)))
208 goto ERROR;
209 }
210
211 if (!base || (value->linespacing != base->linespacing)) {
212 if ((res = psiconv_write_u8(extra_buf,0x07)))
213 goto ERROR;
214 if ((res = psiconv_write_size(extra_buf,value->linespacing)))
215 goto ERROR;
216 }
217
218 if (!base || (value->linespacing_exact != base->linespacing_exact)) {
219 if ((res = psiconv_write_u8(extra_buf,0x08)))
220 goto ERROR;
221 if ((res = psiconv_write_bool(extra_buf,value->linespacing_exact)))
222 goto ERROR;
223 }
224
225 if (!base || (value->space_above != base->space_above)) {
226 if ((res = psiconv_write_u8(extra_buf,0x09)))
227 goto ERROR;
228 if ((res = psiconv_write_size(extra_buf,value->space_above)))
229 goto ERROR;
230 }
231
232 if (!base || (value->space_below != base->space_below)) {
233 if ((res = psiconv_write_u8(extra_buf,0x0a)))
234 goto ERROR;
235 if ((res = psiconv_write_size(extra_buf,value->space_below)))
236 goto ERROR;
237 }
238
239 if (!base || (value->keep_together != base->keep_together)) {
240 if ((res = psiconv_write_u8(extra_buf,0x0b)))
241 goto ERROR;
242 if ((res = psiconv_write_bool(extra_buf,value->keep_together)))
243 goto ERROR;
244 }
245
246 if (!base || (value->keep_with_next != base->keep_with_next)) {
247 if ((res = psiconv_write_u8(extra_buf,0x0c)))
248 goto ERROR;
249 if ((res = psiconv_write_bool(extra_buf,value->keep_with_next)))
250 goto ERROR;
251 }
252
253 if (!base || (value->on_next_page != base->on_next_page)) {
254 if ((res = psiconv_write_u8(extra_buf,0x0d)))
255 goto ERROR;
256 if ((res = psiconv_write_bool(extra_buf,value->on_next_page)))
257 goto ERROR;
258 }
259
260 if (!base || (value->no_widow_protection != base->no_widow_protection)) {
261 if ((res = psiconv_write_u8(extra_buf,0x0e)))
262 goto ERROR;
263 if ((res = psiconv_write_bool(extra_buf,value->no_widow_protection)))
264 goto ERROR;
265 }
266
267 if (!base || (value->wrap_to_fit_cell != base->wrap_to_fit_cell)) {
268 if ((res = psiconv_write_u8(extra_buf,0x0f)))
269 goto ERROR;
270 if ((res = psiconv_write_bool(extra_buf,value->wrap_to_fit_cell)))
271 goto ERROR;
272 }
273
274 if (!base || (value->border_distance != base->border_distance)) {
275 if ((res = psiconv_write_u8(extra_buf,0x10)))
276 goto ERROR;
277 if ((res = psiconv_write_length(extra_buf,value->border_distance)))
278 goto ERROR;
279 }
280
281 if (!base || psiconv_compare_border(value->top_border,base->top_border)) {
282 if ((res = psiconv_write_u8(extra_buf,0x11)))
283 goto ERROR;
284 if ((res = psiconv_write_border(extra_buf,value->top_border)))
285 goto ERROR;
286 }
287
288 if (!base || psiconv_compare_border(value->bottom_border,
289 base->bottom_border)) {
290 if ((res = psiconv_write_u8(extra_buf,0x12)))
291 goto ERROR;
292 if ((res = psiconv_write_border(extra_buf,value->bottom_border)))
293 goto ERROR;
294 }
295
296 if (!base || psiconv_compare_border(value->left_border,
297 base->left_border)) {
298 if ((res = psiconv_write_u8(extra_buf,0x13)))
299 goto ERROR;
300 if ((res = psiconv_write_border(extra_buf,value->left_border)))
301 goto ERROR;
302 }
303
304 if (!base || psiconv_compare_border(value->right_border,
305 base->right_border)) {
306 if ((res = psiconv_write_u8(extra_buf,0x14)))
307 goto ERROR;
308 if ((res = psiconv_write_border(extra_buf,value->right_border)))
309 goto ERROR;
310 }
311
312 if (!base || psiconv_compare_bullet(value->bullet,
313 base->bullet)) {
314 if ((res = psiconv_write_u8(extra_buf,0x15)))
315 goto ERROR;
316 if ((res = psiconv_write_bullet(extra_buf,value->bullet)))
317 goto ERROR;
318 }
319
320 if (!value->tabs || !value->tabs->extras) {
321 psiconv_warn(0,psiconv_buffer_length(buf),"Null tabs");
322 res = -PSICONV_E_GENERATE;
323 goto ERROR;
324 }
325
326 /* It is not entirely clear how tabs are inherited. For now, I assume
327 if there is any difference at all, we will have to generate both
328 the normal tab-interval, and all specific tabs */
329 if (!base || psiconv_compare_all_tabs(value->tabs,base->tabs)) {
330 if ((res = psiconv_write_u8(extra_buf,0x16)))
331 goto ERROR;
332 if ((res = psiconv_write_length(extra_buf,value->tabs->normal)))
333 goto ERROR;
334 for (i = 0; i < psiconv_list_length(value->tabs->extras); i++) {
335 if (!(tab = psiconv_list_get(value->tabs->extras,i))) {
336 psiconv_warn(0,psiconv_buffer_length(buf),"Massive memory corruption");
337 res = -PSICONV_E_NOMEM;
338 goto ERROR;
339 }
340 if ((res = psiconv_write_u8(extra_buf,0x17)))
341 goto ERROR;
342 if ((res = psiconv_write_tab(extra_buf,tab)))
343 goto ERROR;
344 }
345 }
346
347 if ((res = psiconv_write_u32(buf,psiconv_buffer_length(extra_buf))))
348 goto ERROR;
349
350 res = psiconv_buffer_concat(buf,extra_buf);
351
352 ERROR:
353 psiconv_buffer_free(extra_buf);
354 return res;
355 }
356
357 int psiconv_write_character_layout_list(psiconv_buffer buf,
358 psiconv_character_layout value,
359 psiconv_character_layout base)
360 {
361 int res;
362 psiconv_buffer extra_buf;
363 if (!value) {
364 psiconv_warn(0,psiconv_buffer_length(buf),"Null character layout list");
365 return -PSICONV_E_GENERATE;
366 }
367 if (!(extra_buf = psiconv_buffer_new()))
368 return -PSICONV_E_NOMEM;
369
370 if (!base || psiconv_compare_color(base->color,value->color)) {
371 if ((res = psiconv_write_u8(extra_buf,0x19)))
372 goto ERROR;
373 if ((res = psiconv_write_color(extra_buf,value->color)))
374 goto ERROR;
375 }
376
377 if (!base || psiconv_compare_color(base->back_color,value->back_color)) {
378 if ((res = psiconv_write_u8(extra_buf,0x1a)))
379 goto ERROR;
380 if ((res = psiconv_write_color(extra_buf,value->back_color)))
381 goto ERROR;
382 }
383
384 if (!base || (value->font_size != base->font_size)) {
385 if ((res = psiconv_write_u8(extra_buf,0x1c)))
386 goto ERROR;
387 if ((res = psiconv_write_size(extra_buf,value->font_size)))
388 goto ERROR;
389 }
390
391 if (!base || (value->italic != base->italic)) {
392 if ((res = psiconv_write_u8(extra_buf,0x1d)))
393 goto ERROR;
394 if ((res = psiconv_write_bool(extra_buf,value->italic)))
395 goto ERROR;
396 }
397
398 if (!base || (value->bold != base->bold)) {
399 if ((res = psiconv_write_u8(extra_buf,0x1e)))
400 goto ERROR;
401 if ((res = psiconv_write_bool(extra_buf,value->bold)))
402 goto ERROR;
403 }
404
405 if (!base || (value->super_sub != base->super_sub)) {
406 if ((value->super_sub != psiconv_superscript) &&
407 (value->super_sub != psiconv_subscript) &&
408 (value->super_sub != psiconv_normalscript))
409 psiconv_warn(0,psiconv_buffer_length(buf),
410 "Unknown supersubscript (%d); assuming normal",
411 value->super_sub);
412 if ((res = psiconv_write_u8(extra_buf,0x1f)))
413 goto ERROR;
414 if ((res = psiconv_write_u8(extra_buf,
415 value->super_sub == psiconv_superscript?1:
416 value->super_sub == psiconv_subscript?2:0)))
417 goto ERROR;
418 }
419
420 if (!base || (value->underline != base->underline)) {
421 if ((res = psiconv_write_u8(extra_buf,0x20)))
422 goto ERROR;
423 if ((res = psiconv_write_bool(extra_buf,value->underline)))
424 goto ERROR;
425 }
426
427 if (!base || (value->strikethrough != base->strikethrough)) {
428 if ((res = psiconv_write_u8(extra_buf,0x21)))
429 goto ERROR;
430 if ((res = psiconv_write_bool(extra_buf,value->strikethrough)))
431 goto ERROR;
432 }
433
434 if (!base || psiconv_compare_font(base->font,value->font)) {
435 if ((res = psiconv_write_u8(extra_buf,0x22)))
436 goto ERROR;
437 if ((res = psiconv_write_font(extra_buf,value->font)))
438 goto ERROR;
439 }
440
441 if ((res = psiconv_write_u32(buf,psiconv_buffer_length(extra_buf))))
442 goto ERROR;
443
444 res = psiconv_buffer_concat(buf,extra_buf);
445
446 ERROR:
447 psiconv_buffer_free(extra_buf);
448 return res;
449 }

frodo@frodo.looijaard.name
ViewVC Help
Powered by ViewVC 1.1.26