1 /************************************************************************/
2 /* */
3 /* Management of Border Properties. */
4 /* */
5 /************************************************************************/
6
7 # include "docBaseConfig.h"
8
9 # include <utilPalette.h>
10
11 # include <appDebugon.h>
12
13 # include "docBorderProperties.h"
14
15 /************************************************************************/
16 /* */
17 /* Initialise Border Properties. */
18 /* */
19 /************************************************************************/
20
docInitBorderProperties(BorderProperties * bp)21 void docInitBorderProperties( BorderProperties * bp )
22 {
23 bp->bpColor= 0;
24 bp->bpSpacingTwips= 0;
25 bp->bpPenWideTwips= 15;
26 bp->bpStyle= DOCbsNONE;
27 bp->bpArt= 0;
28 }
29
30 /************************************************************************/
31 /* */
32 /* Get the thickness of a border. */
33 /* */
34 /************************************************************************/
35
docBorderThick(int * pSpace,const BorderProperties * bp)36 int docBorderThick( int * pSpace,
37 const BorderProperties * bp )
38 {
39 int space;
40 int thick;
41
42 if ( ! DOCisBORDER( bp ) )
43 {
44 thick= 0;
45 space= 0;
46 }
47 else{
48 thick= bp->bpPenWideTwips;
49
50 if ( bp->bpStyle == DOCbsTH )
51 { thick *= 2; }
52
53 /* This is the way MS-Word works: */
54 if ( thick > 0 && thick < 5 )
55 { thick= 5; }
56
57 space= bp->bpSpacingTwips;
58 }
59
60 *pSpace= space;
61 return thick;
62 }
63
64
65 /************************************************************************/
66 /* */
67 /* 1) Are the columns in two RowProperties 'the same' (Do they align?) */
68 /* 2) All column properties identical? */
69 /* */
70 /************************************************************************/
71
docBorderPropertyDifference(PropertyMask * pBpDifMask,const BorderProperties * bpTo,const PropertyMask * bpCmpMask,const BorderProperties * bpFrom,const int * colorMap)72 static void docBorderPropertyDifference(
73 PropertyMask * pBpDifMask,
74 const BorderProperties * bpTo,
75 const PropertyMask * bpCmpMask,
76 const BorderProperties * bpFrom,
77 const int * colorMap )
78 {
79 PropertyMask bpDifMask;
80
81 utilPropMaskClear( &bpDifMask );
82
83 if ( PROPmaskISSET( bpCmpMask, BRDRpropCOLOR ) )
84 {
85 int fromColor= bpFrom->bpColor;
86
87 if ( fromColor > 0 && colorMap )
88 { fromColor= colorMap[fromColor]; }
89
90 if ( bpTo->bpColor != fromColor )
91 { PROPmaskADD( &bpDifMask, BRDRpropCOLOR ); }
92 }
93
94 if ( PROPmaskISSET( bpCmpMask, BRDRpropSPACING ) )
95 {
96 if ( bpTo->bpSpacingTwips != bpFrom->bpSpacingTwips )
97 { PROPmaskADD( &bpDifMask, BRDRpropSPACING ); }
98 }
99
100 if ( PROPmaskISSET( bpCmpMask, BRDRpropPEN_WIDE ) )
101 {
102 if ( bpTo->bpPenWideTwips != bpFrom->bpPenWideTwips )
103 { PROPmaskADD( &bpDifMask, BRDRpropPEN_WIDE ); }
104 }
105
106 if ( PROPmaskISSET( bpCmpMask, BRDRpropSTYLE ) )
107 {
108 if ( bpTo->bpStyle != bpFrom->bpStyle )
109 { PROPmaskADD( &bpDifMask, BRDRpropSTYLE ); }
110 }
111
112 if ( PROPmaskISSET( bpCmpMask, BRDRpropART ) )
113 {
114 if ( bpTo->bpArt != bpFrom->bpArt )
115 { PROPmaskADD( &bpDifMask, BRDRpropART ); }
116 }
117
118 *pBpDifMask= bpDifMask;
119 return;
120 }
121
docUpdateBorderProperties(PropertyMask * pBpDoneMask,BorderProperties * bpTo,const PropertyMask * bpSetMask,const BorderProperties * bpSet)122 void docUpdateBorderProperties( PropertyMask * pBpDoneMask,
123 BorderProperties * bpTo,
124 const PropertyMask * bpSetMask,
125 const BorderProperties * bpSet )
126 {
127 PropertyMask bpDoneMask;
128
129 utilPropMaskClear( &bpDoneMask );
130
131 if ( PROPmaskISSET( bpSetMask, BRDRpropCOLOR ) )
132 {
133 if ( bpTo->bpColor != bpSet->bpColor )
134 {
135 bpTo->bpColor= bpSet->bpColor;
136 PROPmaskADD( &bpDoneMask, BRDRpropCOLOR );
137 }
138 }
139
140 if ( PROPmaskISSET( bpSetMask, BRDRpropSPACING ) )
141 {
142 if ( bpTo->bpSpacingTwips != bpSet->bpSpacingTwips )
143 {
144 bpTo->bpSpacingTwips= bpSet->bpSpacingTwips;
145 PROPmaskADD( &bpDoneMask, BRDRpropSPACING );
146 }
147 }
148
149 if ( PROPmaskISSET( bpSetMask, BRDRpropPEN_WIDE ) )
150 {
151 if ( bpTo->bpPenWideTwips != bpSet->bpPenWideTwips )
152 {
153 bpTo->bpPenWideTwips= bpSet->bpPenWideTwips;
154 PROPmaskADD( &bpDoneMask, BRDRpropPEN_WIDE );
155 }
156 }
157
158 if ( PROPmaskISSET( bpSetMask, BRDRpropSTYLE ) )
159 {
160 if ( bpTo->bpStyle != bpSet->bpStyle )
161 {
162 bpTo->bpStyle= bpSet->bpStyle;
163 PROPmaskADD( &bpDoneMask, BRDRpropSTYLE );
164 }
165 }
166
167 if ( PROPmaskISSET( bpSetMask, BRDRpropART ) )
168 {
169 if ( bpTo->bpArt != bpSet->bpArt )
170 {
171 bpTo->bpArt= bpSet->bpArt;
172 PROPmaskADD( &bpDoneMask, BRDRpropART );
173 }
174 }
175
176 *pBpDoneMask= bpDoneMask;
177 return;
178 }
179
docBordersDiffer(const BorderProperties * bpTo,const BorderProperties * bpFrom,const int * colorMap)180 int docBordersDiffer( const BorderProperties * bpTo,
181 const BorderProperties * bpFrom,
182 const int * colorMap )
183 {
184 PropertyMask bpCmpMask;
185 PropertyMask bpDifMask;
186
187 utilPropMaskClear( &bpDifMask );
188 utilPropMaskClear( &bpCmpMask );
189 utilPropMaskFill( &bpCmpMask, BRDRprop_COUNT );
190
191 docBorderPropertyDifference( &bpDifMask, bpTo,
192 &bpCmpMask, bpFrom, colorMap );
193
194 if ( ! utilPropMaskIsEmpty( &bpDifMask ) )
195 { return 1; }
196
197 return 0;
198 }
199
docCopyBorderProperties(BorderProperties * bpTo,const BorderProperties * bpFrom,const int * colorMap)200 void docCopyBorderProperties( BorderProperties * bpTo,
201 const BorderProperties * bpFrom,
202 const int * colorMap )
203 {
204 *bpTo= *bpFrom;
205
206 if ( ! DOCisBORDER( bpTo ) )
207 { bpTo->bpColor= 0; }
208 else{
209 if ( bpTo->bpColor > 0 && colorMap )
210 { bpTo->bpColor= colorMap[bpTo->bpColor]; }
211 }
212
213 return;
214 }
215
216 /************************************************************************/
217 /* */
218 /* Add the space occupied by a border to an inset. */
219 /* */
220 /************************************************************************/
221
docAddBorderToInset(int * pInset,const BorderProperties * bp)222 void docAddBorderToInset( int * pInset,
223 const BorderProperties * bp )
224 {
225 if ( ! DOCisBORDER( bp ) )
226 { return; }
227
228 (*pInset) += bp->bpSpacingTwips;
229 (*pInset) += bp->bpPenWideTwips;
230
231 return;
232 }
233
docStretchInsetForBorder(int * pInset,const BorderProperties * bp)234 void docStretchInsetForBorder( int * pInset,
235 const BorderProperties * bp )
236 {
237 int inset= 0;
238
239 if ( ! DOCisBORDER( bp ) )
240 { return; }
241
242 inset += bp->bpSpacingTwips;
243 inset += bp->bpPenWideTwips;
244
245 if ( (*pInset) < inset )
246 { (*pInset)= inset; }
247
248 return;
249 }
250
251 /************************************************************************/
252 /* */
253 /* Expand the palette references in border properties. */
254 /* */
255 /************************************************************************/
256
docExpandBorderProperties(ExpandedBorderProperties * ebp,const BorderProperties * bp,const ColorPalette * cp)257 void docExpandBorderProperties( ExpandedBorderProperties * ebp,
258 const BorderProperties * bp,
259 const ColorPalette * cp )
260 {
261 if ( bp->bpColor == 0 )
262 {
263 ebp->ebpColorExplicit= 0;
264 utilInitRGB8Color( &(ebp->ebpColor) );
265 }
266 else{
267 if ( bp->bpColor >= cp->cpColorCount )
268 {
269 LLDEB(bp->bpColor,cp->cpColorCount);
270
271 ebp->ebpColorExplicit= 0;
272 utilInitRGB8Color( &(ebp->ebpColor) );
273 }
274 else{
275 ebp->ebpColorExplicit= 1;
276 ebp->ebpColor= cp->cpColors[bp->bpColor];
277 }
278 }
279
280 ebp->ebpPenWideTwips= bp->bpPenWideTwips;
281 ebp->ebpStyle= bp->bpStyle;
282 ebp->ebpArt= bp->bpArt;
283 ebp->ebpSpacingTwips= bp->bpSpacingTwips;
284
285 return;
286 }
287
288 /************************************************************************/
289 /* */
290 /* Get the palette references in a border properties. */
291 /* */
292 /************************************************************************/
293
docIndirectBorderProperties(PropertyMask * pBpDoneMask,BorderProperties * bpTo,const PropertyMask * bpSetMask,const ExpandedBorderProperties * ebpFrom,ColorPalette * cp)294 int docIndirectBorderProperties(
295 PropertyMask * pBpDoneMask,
296 BorderProperties * bpTo,
297 const PropertyMask * bpSetMask,
298 const ExpandedBorderProperties * ebpFrom,
299 ColorPalette * cp )
300 {
301 PropertyMask bpDoneMask;
302
303 utilPropMaskClear( &bpDoneMask );
304
305 if ( PROPmaskISSET( bpSetMask, BRDRpropCOLOR ) )
306 {
307 const int avoidZero= 1;
308 const int maxColors= 256;
309 int color;
310
311 if ( ebpFrom->ebpColorExplicit )
312 {
313 color= utilPaletteInsertColor( cp,
314 avoidZero, maxColors, &(ebpFrom->ebpColor) );
315 if ( color < 0 )
316 { LDEB(color); return -1; }
317
318 color= color;
319 }
320 else{ color= 0; }
321
322 if ( bpTo->bpColor != color )
323 {
324 bpTo->bpColor= color;
325 PROPmaskADD( &bpDoneMask, BRDRpropCOLOR );
326 }
327 }
328
329 if ( PROPmaskISSET( bpSetMask, BRDRpropSPACING ) )
330 {
331 if ( bpTo->bpSpacingTwips != ebpFrom->ebpSpacingTwips )
332 {
333 bpTo->bpSpacingTwips= ebpFrom->ebpSpacingTwips;
334 PROPmaskADD( &bpDoneMask, BRDRpropSPACING );
335 }
336 }
337
338 if ( PROPmaskISSET( bpSetMask, BRDRpropPEN_WIDE ) )
339 {
340 if ( bpTo->bpPenWideTwips != ebpFrom->ebpPenWideTwips )
341 {
342 bpTo->bpPenWideTwips= ebpFrom->ebpPenWideTwips;
343 PROPmaskADD( &bpDoneMask, BRDRpropPEN_WIDE );
344 }
345 }
346
347 if ( PROPmaskISSET( bpSetMask, BRDRpropSTYLE ) )
348 {
349 if ( bpTo->bpStyle != ebpFrom->ebpStyle )
350 {
351 bpTo->bpStyle= ebpFrom->ebpStyle;
352 PROPmaskADD( &bpDoneMask, BRDRpropSTYLE );
353 }
354 }
355
356 if ( PROPmaskISSET( bpSetMask, BRDRpropART ) )
357 {
358 if ( bpTo->bpArt != ebpFrom->ebpArt )
359 {
360 bpTo->bpArt= ebpFrom->ebpArt;
361 PROPmaskADD( &bpDoneMask, BRDRpropART );
362 }
363 }
364
365 *pBpDoneMask= bpDoneMask;
366 return 0;
367 }
368
369
370 /************************************************************************/
371 /* */
372 /* Initialize expanded border properties. */
373 /* */
374 /************************************************************************/
375
docInitExpandedBorderProperties(ExpandedBorderProperties * ebp)376 void docInitExpandedBorderProperties( ExpandedBorderProperties * ebp )
377 {
378 ebp->ebpColorExplicit= 0;
379
380 utilInitRGB8Color( &(ebp->ebpColor) );
381
382 ebp->ebpSpacingTwips= 0;
383 ebp->ebpPenWideTwips= 15;
384 ebp->ebpStyle= DOCbsNONE;
385 ebp->ebpArt= 0;
386 }
387
388 /************************************************************************/
389 /* */
390 /* Set a border property. */
391 /* */
392 /************************************************************************/
393
docSetBorderProperty(BorderProperties * bp,int prop,int arg)394 int docSetBorderProperty( BorderProperties * bp,
395 int prop,
396 int arg )
397 {
398 switch( prop )
399 {
400 case BRDRpropPEN_WIDE:
401 if ( arg > 255 )
402 { LDEB(arg); arg= 255; }
403
404 bp->bpPenWideTwips= arg;
405 break;
406
407 case BRDRpropCOLOR:
408 if ( arg > 255 )
409 { LDEB(arg); arg= 255; }
410
411 bp->bpColor= arg;
412 break;
413
414 case BRDRpropSPACING:
415 bp->bpSpacingTwips= arg;
416 break;
417
418 case BRDRpropSTYLE:
419 bp->bpStyle= arg;
420 break;
421
422 case BRDRpropART:
423 bp->bpArt= arg;
424 break;
425
426 default:
427 LDEB(prop); return -1;
428 }
429
430 return 0;
431 }
432
433
434 /************************************************************************/
435 /* */
436 /* Get a border property. */
437 /* */
438 /************************************************************************/
439
docGetBorderProperty(const BorderProperties * bp,int prop)440 int docGetBorderProperty( const BorderProperties * bp,
441 int prop )
442 {
443 switch( prop )
444 {
445 case BRDRpropPEN_WIDE:
446 return bp->bpPenWideTwips;
447
448 case BRDRpropCOLOR:
449 return bp->bpColor;
450
451 case BRDRpropSPACING:
452 return bp->bpSpacingTwips;
453
454 case BRDRpropSTYLE:
455 return bp->bpStyle;
456
457 case BRDRpropART:
458 return bp->bpArt;
459
460 default:
461 LDEB(prop); return -1;
462 }
463 }
464
465