home *** CD-ROM | disk | FTP | other *** search
/ Chestnut's Multimedia Mania / MM_MANIA.ISO / graphics / povsrc20 / colour.c < prev    next >
C/C++ Source or Header  |  1993-07-28  |  5KB  |  183 lines

  1. /****************************************************************************
  2. *                   colour.c
  3. *
  4. *  This module implements routines to manipulate colours.
  5. *
  6. *  from Persistence of Vision Raytracer
  7. *  Copyright 1993 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. If 
  14. *  POVLEGAL.DOC is not available or for more info please contact the POV-Ray
  15. *  Team Coordinator by leaving a message in CompuServe's Graphics Developer's
  16. *  Forum.  The latest version of POV-Ray may be found there as well.
  17. *
  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.
  21. *
  22. *****************************************************************************/
  23.  
  24. #include "frame.h"
  25. #include "vector.h"
  26. #include "povproto.h"
  27.  
  28. #define FABS(x) ((x) < 0.0 ? (0.0 - (x)) : (x))
  29.  
  30. COLOUR_MAP_ENTRY *Build_Entries;
  31.  
  32. COLOUR *Create_Colour ()
  33.   {
  34.   COLOUR *New;
  35.  
  36.   if ((New = (COLOUR *) malloc (sizeof (COLOUR))) == NULL)
  37.     MAError ("color");
  38.  
  39.   Make_Colour (New, 0.0, 0.0, 0.0);
  40.   return (New);
  41.   }
  42.  
  43. COLOUR *Copy_Colour (Old)
  44. COLOUR *Old;
  45.   {
  46.   COLOUR *New;
  47.   if (Old != NULL)
  48.     {
  49.     New  = Create_Colour ();
  50.     *New = *Old;
  51.     }
  52.   else New = NULL;
  53.   return (New);
  54.   }
  55.  
  56.   COLOUR_MAP_ENTRY *Create_CMap_Entries (Map_Size)
  57.     int Map_Size;
  58.   {
  59.   COLOUR_MAP_ENTRY *New;
  60.  
  61.   if ((New = (COLOUR_MAP_ENTRY *)
  62.     malloc(Map_Size * sizeof (COLOUR_MAP_ENTRY))) == NULL)
  63.     MAError ("colour map entry");
  64.   return (New);
  65.   }
  66.  
  67. COLOUR_MAP_ENTRY *Copy_CMap_Entries (Old,Map_Size)
  68. COLOUR_MAP_ENTRY *Old;
  69. int Map_Size;
  70.   {
  71.   COLOUR_MAP_ENTRY *New;
  72.   register int i;
  73.  
  74.   if (Old != NULL)
  75.     {
  76.     New = Create_CMap_Entries (Map_Size);
  77.     for (i = 0; i < Map_Size; i++)
  78.       New[i] = Old[i];
  79.     }
  80.   else
  81.     New = NULL;
  82.   return (New);
  83.   }
  84.  
  85. COLOUR_MAP *Create_Colour_Map ()
  86.   {
  87.   COLOUR_MAP *New;
  88.  
  89.   if ((New = (COLOUR_MAP *) malloc (sizeof (COLOUR_MAP))) == NULL)
  90.     MAError ("colour map");
  91.  
  92.   New->Users = 0;
  93.   New->Number_Of_Entries = 0;
  94.   New->Colour_Map_Entries = NULL;
  95.   New->Transparency_Flag = FALSE;
  96.   return (New);
  97.   }   
  98.  
  99. COLOUR_MAP *Copy_Colour_Map (Old)
  100. COLOUR_MAP *Old;
  101.   {
  102.   COLOUR_MAP *New;
  103.  
  104.   New = Old;
  105.   if (New != NULL)
  106.     New->Users++;
  107.  
  108.   return (New);
  109.   }
  110.  
  111. DBL Colour_Distance (colour1, colour2)
  112. COLOUR *colour1, *colour2;
  113.   {
  114.   return (FABS (colour1->Red - colour2->Red)
  115.     + FABS (colour1->Green - colour2->Green)
  116.     + FABS (colour1->Blue - colour2->Blue));
  117.   }
  118.  
  119. void Add_Colour (result, colour1, colour2)
  120. COLOUR *result, *colour1, *colour2;
  121.   {
  122.   result->Red = colour1->Red + colour2->Red;
  123.   result->Green = colour1->Green + colour2->Green;
  124.   result->Blue = colour1->Blue + colour2->Blue;
  125.   result->Filter = colour1->Filter + colour2->Filter;
  126.   }
  127.  
  128. void Scale_Colour (result, colour, factor)
  129. COLOUR *result, *colour;
  130. DBL factor;
  131.   {
  132.   result->Red = colour->Red * factor;
  133.   result->Green = colour->Green * factor;
  134.   result->Blue = colour->Blue * factor;
  135.   result->Filter = colour->Filter * factor;
  136.   }
  137.  
  138. void Clip_Colour (result, colour)
  139. COLOUR *result, *colour;
  140.   {
  141.   if (colour -> Red > 1.0)
  142.     result -> Red = 1.0;
  143.   else if (colour -> Red < 0.0)
  144.     result -> Red = 0.0;
  145.   else result -> Red = colour -> Red;
  146.  
  147.     if (colour -> Green > 1.0)
  148.       result -> Green = 1.0;
  149.     else if (colour -> Green < 0.0)
  150.       result -> Green = 0.0;
  151.     else result -> Green = colour -> Green;
  152.  
  153.     if (colour -> Blue > 1.0)
  154.       result -> Blue = 1.0;
  155.     else if (colour -> Blue < 0.0)
  156.       result -> Blue = 0.0;
  157.     else result -> Blue = colour -> Blue;
  158.  
  159.     if (colour -> Filter > 1.0)
  160.       result -> Filter = 1.0;
  161.     else if (colour -> Filter < 0.0)
  162.       result -> Filter = 0.0;
  163.     else result -> Filter = colour -> Filter;
  164.   }
  165.  
  166.   void Destroy_Colour_Map (CMap)
  167.     COLOUR_MAP *CMap;
  168.   {
  169.   if (CMap == NULL)
  170.     return;
  171.  
  172.   if (CMap->Users < 0)
  173.     return;
  174.  
  175.   CMap->Users--;
  176.  
  177.   if (CMap->Users >= 0)
  178.     return;
  179.  
  180.   free (CMap->Colour_Map_Entries);
  181.   free (CMap);
  182.   }
  183.