1 /****************************************************************************
4 * This module implements routines to manipulate colours.
6 * from Persistence of Vision(tm) Ray Tracer
7 * Copyright 1996,1999 Persistence of Vision Team
8 *---------------------------------------------------------------------------
9 * NOTICE: This source code file is provided so that users may experiment
10 * with enhancements to POV-Ray and to port the software to platforms other
11 * than those supported by the POV-Ray Team. There are strict rules under
12 * which you are permitted to use this file. The rules are in the file
13 * named POVLEGAL.DOC which should be distributed with this file.
14 * If POVLEGAL.DOC is not available or for more info please contact the POV-Ray
15 * Team Coordinator by email to team-coord@povray.org or visit us on the web at
16 * http://www.povray.org. The latest version of POV-Ray may be found at this site.
18 * This program is based on the popular DKB raytracer version 2.12.
19 * DKBTrace was originally written by David K. Buck.
20 * DKBTrace Ver 2.0-2.12 were written by David K. Buck & Aaron A. Collins.
22 *****************************************************************************/
33 /*****************************************************************************
34 * Local preprocessor defines
35 ******************************************************************************/
39 /*****************************************************************************
41 ******************************************************************************/
45 /*****************************************************************************
47 ******************************************************************************/
50 /*****************************************************************************
52 ******************************************************************************/
56 /*****************************************************************************
78 ******************************************************************************/
80 COLOUR
*Create_Colour ()
84 New
= (COLOUR
*)POV_MALLOC(sizeof (COLOUR
), "color");
86 Make_Colour (*New
, 0.0, 0.0, 0.0);
93 /*****************************************************************************
115 ******************************************************************************/
117 COLOUR
*Copy_Colour (COLOUR Old
)
123 New
= Create_Colour ();
125 Assign_Colour(*New
,Old
);
137 /*****************************************************************************
157 * Aug 1995 : Use POV_CALLOC to initialize entries. [DB]
159 ******************************************************************************/
161 BLEND_MAP_ENTRY
*Create_BMap_Entries (int Map_Size
)
163 BLEND_MAP_ENTRY
*New
;
165 New
= (BLEND_MAP_ENTRY
*)POV_CALLOC((size_t)Map_Size
, sizeof (BLEND_MAP_ENTRY
), "blend map entry");
172 /*****************************************************************************
191 ******************************************************************************/
193 BLEND_MAP_ENTRY
*Copy_BMap_Entries (BLEND_MAP_ENTRY
*Old
, int Map_Size
, int Type
)
196 BLEND_MAP_ENTRY
*New
;
200 New
= Create_BMap_Entries (Map_Size
);
202 for (i
= 0; i
< Map_Size
; i
++)
208 New
[i
].Vals
.Pigment
= Copy_Pigment(Old
[i
].Vals
.Pigment
);
214 New
[i
].Vals
.Tnormal
= Copy_Tnormal(Old
[i
].Vals
.Tnormal
);
220 New
[i
].Vals
.Texture
= Copy_Textures(Old
[i
].Vals
.Texture
);
243 /*****************************************************************************
267 ******************************************************************************/
269 BLEND_MAP
*Create_Blend_Map ()
273 New
= (BLEND_MAP
*)POV_MALLOC(sizeof (BLEND_MAP
), "blend map");
277 New
->Number_Of_Entries
= 0;
279 New
->Type
= COLOUR_TYPE
;
281 New
->Blend_Map_Entries
= NULL
;
283 New
->Transparency_Flag
= FALSE
;
290 /*****************************************************************************
314 ******************************************************************************/
316 BLEND_MAP
*Copy_Blend_Map (BLEND_MAP
*Old
)
323 * Do not increase the users field if it is negative.
325 * A negative users field incicates a reference to a static
326 * or global memory area in the data segment, not on the heap!
327 * Thus it must not be deleted later.
330 if ((New
!= NULL
) && (New
->Users
>= 0))
340 /*****************************************************************************
364 ******************************************************************************/
366 DBL
Colour_Distance (COLOUR colour1
, COLOUR colour2
)
368 return (fabs(colour1
[RED
] - colour2
[RED
]) +
369 fabs(colour1
[GREEN
] - colour2
[GREEN
]) +
370 fabs(colour1
[BLUE
] - colour2
[BLUE
]));
375 /*****************************************************************************
399 ******************************************************************************/
401 void Add_Colour (COLOUR result
, COLOUR colour1
, COLOUR colour2
)
403 result
[RED
] = colour1
[RED
] + colour2
[RED
];
404 result
[GREEN
] = colour1
[GREEN
] + colour2
[GREEN
];
405 result
[BLUE
] = colour1
[BLUE
] + colour2
[BLUE
];
406 result
[FILTER
] = colour1
[FILTER
] + colour2
[FILTER
];
407 result
[TRANSM
] = colour1
[TRANSM
] + colour2
[TRANSM
];
412 /*****************************************************************************
436 ******************************************************************************/
438 void Scale_Colour (COLOUR result
, COLOUR colour
, DBL factor
)
440 result
[RED
] = colour
[RED
] * factor
;
441 result
[GREEN
] = colour
[GREEN
] * factor
;
442 result
[BLUE
] = colour
[BLUE
] * factor
;
443 result
[FILTER
] = colour
[FILTER
] * factor
;
444 result
[TRANSM
] = colour
[TRANSM
] * factor
;
449 /*****************************************************************************
473 ******************************************************************************/
475 void Clip_Colour (COLOUR result
, COLOUR colour
)
477 if (colour
[RED
] > 1.0)
483 if (colour
[RED
] < 0.0)
489 result
[RED
] = colour
[RED
];
493 if (colour
[GREEN
] > 1.0)
499 if (colour
[GREEN
] < 0.0)
505 result
[GREEN
] = colour
[GREEN
];
509 if (colour
[BLUE
] > 1.0)
515 if (colour
[BLUE
] < 0.0)
521 result
[BLUE
] = colour
[BLUE
];
525 if (colour
[FILTER
] > 1.0)
527 result
[FILTER
] = 1.0;
531 if (colour
[FILTER
] < 0.0)
533 result
[FILTER
] = 0.0;
537 result
[FILTER
] = colour
[FILTER
];
541 if (colour
[TRANSM
] > 1.0)
543 result
[TRANSM
] = 1.0;
547 if (colour
[TRANSM
] < 0.0)
549 result
[TRANSM
] = 0.0;
553 result
[TRANSM
] = colour
[TRANSM
];
560 /*****************************************************************************
584 ******************************************************************************/
586 void Destroy_Blend_Map (BLEND_MAP
*BMap
)
592 if (--(BMap
->Users
) == 0)
594 for (i
= 0; i
< BMap
->Number_Of_Entries
; i
++)
600 Destroy_Pigment(BMap
->Blend_Map_Entries
[i
].Vals
.Pigment
);
604 Destroy_Tnormal(BMap
->Blend_Map_Entries
[i
].Vals
.Tnormal
);
608 Destroy_Textures(BMap
->Blend_Map_Entries
[i
].Vals
.Texture
);
612 POV_FREE (BMap
->Blend_Map_Entries
);