Simple test for asyncio.library.
[AROS-Contrib.git] / gfx / povray / colour.c
blob3193364bd3d42e45f3ab24212cefb064da4f7ce5
1 /****************************************************************************
2 * colour.c
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 *****************************************************************************/
24 #include "frame.h"
25 #include "vector.h"
26 #include "povproto.h"
27 #include "colour.h"
28 #include "pigment.h"
29 #include "normal.h"
30 #include "texture.h"
33 /*****************************************************************************
34 * Local preprocessor defines
35 ******************************************************************************/
39 /*****************************************************************************
40 * Local typedefs
41 ******************************************************************************/
45 /*****************************************************************************
46 * Local variables
47 ******************************************************************************/
50 /*****************************************************************************
51 * Static functions
52 ******************************************************************************/
56 /*****************************************************************************
58 * FUNCTION
60 * INPUT
62 * OUTPUT
64 * RETURNS
66 * AUTHOR
68 * POV-Ray Team
70 * DESCRIPTION
72 * -
74 * CHANGES
76 * -
78 ******************************************************************************/
80 COLOUR *Create_Colour ()
82 COLOUR *New;
84 New = (COLOUR *)POV_MALLOC(sizeof (COLOUR), "color");
86 Make_Colour (*New, 0.0, 0.0, 0.0);
88 return (New);
93 /*****************************************************************************
95 * FUNCTION
97 * INPUT
99 * OUTPUT
101 * RETURNS
103 * AUTHOR
105 * POV-Ray Team
107 * DESCRIPTION
111 * CHANGES
115 ******************************************************************************/
117 COLOUR *Copy_Colour (COLOUR Old)
119 COLOUR *New;
121 if (Old != NULL)
123 New = Create_Colour ();
125 Assign_Colour(*New,Old);
127 else
129 New = NULL;
132 return (New);
137 /*****************************************************************************
139 * FUNCTION
141 * INPUT
143 * OUTPUT
145 * RETURNS
147 * AUTHOR
149 * POV-Ray Team
151 * DESCRIPTION
155 * CHANGES
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");
167 return (New);
172 /*****************************************************************************
174 * FUNCTION
176 * INPUT
178 * OUTPUT
180 * RETURNS
182 * AUTHOR
184 * POV-Ray Team
186 * DESCRIPTION
189 * CHANGES
191 ******************************************************************************/
193 BLEND_MAP_ENTRY *Copy_BMap_Entries (BLEND_MAP_ENTRY *Old, int Map_Size, int Type)
195 int i;
196 BLEND_MAP_ENTRY *New;
198 if (Old != NULL)
200 New = Create_BMap_Entries (Map_Size);
202 for (i = 0; i < Map_Size; i++)
204 switch (Type)
206 case PIGMENT_TYPE:
208 New[i].Vals.Pigment = Copy_Pigment(Old[i].Vals.Pigment);
210 break;
212 case NORMAL_TYPE:
214 New[i].Vals.Tnormal = Copy_Tnormal(Old[i].Vals.Tnormal);
216 break;
218 case TEXTURE_TYPE:
220 New[i].Vals.Texture = Copy_Textures(Old[i].Vals.Texture);
222 break;
224 case COLOUR_TYPE:
225 case SLOPE_TYPE:
227 New[i] = Old[i];
229 break;
233 else
235 New = NULL;
238 return (New);
243 /*****************************************************************************
245 * FUNCTION
247 * Create_Blend_Map
249 * INPUT
251 * OUTPUT
253 * RETURNS
255 * AUTHOR
257 * POV-Ray Team
259 * DESCRIPTION
263 * CHANGES
267 ******************************************************************************/
269 BLEND_MAP *Create_Blend_Map ()
271 BLEND_MAP *New;
273 New = (BLEND_MAP *)POV_MALLOC(sizeof (BLEND_MAP), "blend map");
275 New->Users = 1;
277 New->Number_Of_Entries = 0;
279 New->Type = COLOUR_TYPE;
281 New->Blend_Map_Entries = NULL;
283 New->Transparency_Flag = FALSE;
285 return (New);
290 /*****************************************************************************
292 * FUNCTION
294 * Copy_Blend_Map
296 * INPUT
298 * OUTPUT
300 * RETURNS
302 * AUTHOR
304 * POV-Ray Team
306 * DESCRIPTION
310 * CHANGES
314 ******************************************************************************/
316 BLEND_MAP *Copy_Blend_Map (BLEND_MAP *Old)
318 BLEND_MAP *New;
320 New = 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))
332 New->Users++;
335 return (New);
340 /*****************************************************************************
342 * FUNCTION
344 * Colour_Distance
346 * INPUT
348 * OUTPUT
350 * RETURNS
352 * AUTHOR
354 * POV-Ray Team
356 * DESCRIPTION
360 * CHANGES
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 /*****************************************************************************
377 * FUNCTION
379 * Add_Colour
381 * INPUT
383 * OUTPUT
385 * RETURNS
387 * AUTHOR
389 * POV-Ray Team
391 * DESCRIPTION
395 * CHANGES
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 /*****************************************************************************
414 * FUNCTION
416 * Scale_Colour
418 * INPUT
420 * OUTPUT
422 * RETURNS
424 * AUTHOR
426 * POV-Ray Team
428 * DESCRIPTION
432 * CHANGES
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 /*****************************************************************************
451 * FUNCTION
453 * Clip_Colour
455 * INPUT
457 * OUTPUT
459 * RETURNS
461 * AUTHOR
463 * POV-Ray Team
465 * DESCRIPTION
469 * CHANGES
473 ******************************************************************************/
475 void Clip_Colour (COLOUR result, COLOUR colour)
477 if (colour[RED] > 1.0)
479 result[RED] = 1.0;
481 else
483 if (colour[RED] < 0.0)
485 result[RED] = 0.0;
487 else
489 result[RED] = colour[RED];
493 if (colour[GREEN] > 1.0)
495 result[GREEN] = 1.0;
497 else
499 if (colour[GREEN] < 0.0)
501 result[GREEN] = 0.0;
503 else
505 result[GREEN] = colour[GREEN];
509 if (colour[BLUE] > 1.0)
511 result[BLUE] = 1.0;
513 else
515 if (colour[BLUE] < 0.0)
517 result[BLUE] = 0.0;
519 else
521 result[BLUE] = colour[BLUE];
525 if (colour[FILTER] > 1.0)
527 result[FILTER] = 1.0;
529 else
531 if (colour[FILTER] < 0.0)
533 result[FILTER] = 0.0;
535 else
537 result[FILTER] = colour[FILTER];
541 if (colour[TRANSM] > 1.0)
543 result[TRANSM] = 1.0;
545 else
547 if (colour[TRANSM] < 0.0)
549 result[TRANSM] = 0.0;
551 else
553 result[TRANSM] = colour[TRANSM];
560 /*****************************************************************************
562 * FUNCTION
564 * Destroy_Blend_Map
566 * INPUT
568 * OUTPUT
570 * RETURNS
572 * AUTHOR
574 * POV-Ray Team
576 * DESCRIPTION
580 * CHANGES
584 ******************************************************************************/
586 void Destroy_Blend_Map (BLEND_MAP *BMap)
588 int i;
590 if (BMap != NULL)
592 if (--(BMap->Users) == 0)
594 for (i = 0; i < BMap->Number_Of_Entries; i++)
596 switch (BMap->Type)
598 case PIGMENT_TYPE:
599 case DENSITY_TYPE:
600 Destroy_Pigment(BMap->Blend_Map_Entries[i].Vals.Pigment);
601 break;
603 case NORMAL_TYPE:
604 Destroy_Tnormal(BMap->Blend_Map_Entries[i].Vals.Tnormal);
605 break;
607 case TEXTURE_TYPE:
608 Destroy_Textures(BMap->Blend_Map_Entries[i].Vals.Texture);
612 POV_FREE (BMap->Blend_Map_Entries);
614 POV_FREE (BMap);