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