COLOUR.C 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618
  1. /****************************************************************************
  2. * colour.c
  3. *
  4. * This module implements routines to manipulate colours.
  5. *
  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.
  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. #include "frame.h"
  24. #include "vector.h"
  25. #include "povproto.h"
  26. #include "colour.h"
  27. #include "pigment.h"
  28. #include "normal.h"
  29. #include "texture.h"
  30. /*****************************************************************************
  31. * Local preprocessor defines
  32. ******************************************************************************/
  33. /*****************************************************************************
  34. * Local typedefs
  35. ******************************************************************************/
  36. /*****************************************************************************
  37. * Local variables
  38. ******************************************************************************/
  39. /*****************************************************************************
  40. * Static functions
  41. ******************************************************************************/
  42. /*****************************************************************************
  43. *
  44. * FUNCTION
  45. *
  46. * INPUT
  47. *
  48. * OUTPUT
  49. *
  50. * RETURNS
  51. *
  52. * AUTHOR
  53. *
  54. * POV-Ray Team
  55. *
  56. * DESCRIPTION
  57. *
  58. * -
  59. *
  60. * CHANGES
  61. *
  62. * -
  63. *
  64. ******************************************************************************/
  65. COLOUR *Create_Colour ()
  66. {
  67. COLOUR *New;
  68. New = (COLOUR *)POV_MALLOC(sizeof (COLOUR), "color");
  69. Make_Colour (*New, 0.0, 0.0, 0.0);
  70. return (New);
  71. }
  72. /*****************************************************************************
  73. *
  74. * FUNCTION
  75. *
  76. * INPUT
  77. *
  78. * OUTPUT
  79. *
  80. * RETURNS
  81. *
  82. * AUTHOR
  83. *
  84. * POV-Ray Team
  85. *
  86. * DESCRIPTION
  87. *
  88. * -
  89. *
  90. * CHANGES
  91. *
  92. * -
  93. *
  94. ******************************************************************************/
  95. COLOUR *Copy_Colour (COLOUR Old)
  96. {
  97. COLOUR *New;
  98. if (Old != NULL)
  99. {
  100. New = Create_Colour ();
  101. Assign_Colour(*New,Old);
  102. }
  103. else
  104. {
  105. New = NULL;
  106. }
  107. return (New);
  108. }
  109. /*****************************************************************************
  110. *
  111. * FUNCTION
  112. *
  113. * INPUT
  114. *
  115. * OUTPUT
  116. *
  117. * RETURNS
  118. *
  119. * AUTHOR
  120. *
  121. * POV-Ray Team
  122. *
  123. * DESCRIPTION
  124. *
  125. * -
  126. *
  127. * CHANGES
  128. *
  129. * Aug 1995 : Use POV_CALLOC to initialize entries. [DB]
  130. *
  131. ******************************************************************************/
  132. BLEND_MAP_ENTRY *Create_BMap_Entries (int Map_Size)
  133. {
  134. BLEND_MAP_ENTRY *New;
  135. New = (BLEND_MAP_ENTRY *)POV_CALLOC((size_t)Map_Size, sizeof (BLEND_MAP_ENTRY), "blend map entry");
  136. return (New);
  137. }
  138. /*****************************************************************************
  139. *
  140. * FUNCTION
  141. *
  142. * INPUT
  143. *
  144. * OUTPUT
  145. *
  146. * RETURNS
  147. *
  148. * AUTHOR
  149. *
  150. * POV-Ray Team
  151. *
  152. * DESCRIPTION
  153. *
  154. *
  155. * CHANGES
  156. *
  157. ******************************************************************************/
  158. BLEND_MAP_ENTRY *Copy_BMap_Entries (BLEND_MAP_ENTRY *Old, int Map_Size, int Type)
  159. {
  160. int i;
  161. BLEND_MAP_ENTRY *New;
  162. if (Old != NULL)
  163. {
  164. New = Create_BMap_Entries (Map_Size);
  165. for (i = 0; i < Map_Size; i++)
  166. {
  167. switch (Type)
  168. {
  169. case PIGMENT_TYPE:
  170. New[i].Vals.Pigment = Copy_Pigment(Old[i].Vals.Pigment);
  171. break;
  172. case NORMAL_TYPE:
  173. New[i].Vals.Tnormal = Copy_Tnormal(Old[i].Vals.Tnormal);
  174. break;
  175. case TEXTURE_TYPE:
  176. New[i].Vals.Texture = Copy_Textures(Old[i].Vals.Texture);
  177. break;
  178. case COLOUR_TYPE:
  179. case SLOPE_TYPE:
  180. New[i] = Old[i];
  181. break;
  182. }
  183. }
  184. }
  185. else
  186. {
  187. New = NULL;
  188. }
  189. return (New);
  190. }
  191. /*****************************************************************************
  192. *
  193. * FUNCTION
  194. *
  195. * Create_Blend_Map
  196. *
  197. * INPUT
  198. *
  199. * OUTPUT
  200. *
  201. * RETURNS
  202. *
  203. * AUTHOR
  204. *
  205. * POV-Ray Team
  206. *
  207. * DESCRIPTION
  208. *
  209. * -
  210. *
  211. * CHANGES
  212. *
  213. * -
  214. *
  215. ******************************************************************************/
  216. BLEND_MAP *Create_Blend_Map ()
  217. {
  218. BLEND_MAP *New;
  219. New = (BLEND_MAP *)POV_MALLOC(sizeof (BLEND_MAP), "blend map");
  220. New->Users = 1;
  221. New->Number_Of_Entries = 0;
  222. New->Type = COLOUR_TYPE;
  223. New->Blend_Map_Entries = NULL;
  224. New->Transparency_Flag = FALSE;
  225. return (New);
  226. }
  227. /*****************************************************************************
  228. *
  229. * FUNCTION
  230. *
  231. * Copy_Blend_Map
  232. *
  233. * INPUT
  234. *
  235. * OUTPUT
  236. *
  237. * RETURNS
  238. *
  239. * AUTHOR
  240. *
  241. * POV-Ray Team
  242. *
  243. * DESCRIPTION
  244. *
  245. * -
  246. *
  247. * CHANGES
  248. *
  249. * -
  250. *
  251. ******************************************************************************/
  252. BLEND_MAP *Copy_Blend_Map (BLEND_MAP *Old)
  253. {
  254. BLEND_MAP *New;
  255. New = Old;
  256. /*
  257. * Do not increase the users field if it is negative.
  258. *
  259. * A negative users field incicates a reference to a static
  260. * or global memory area in the data segment, not on the heap!
  261. * Thus it must not be deleted later.
  262. */
  263. if ((New != NULL) && (New->Users >= 0))
  264. {
  265. New->Users++;
  266. }
  267. return (New);
  268. }
  269. /*****************************************************************************
  270. *
  271. * FUNCTION
  272. *
  273. * Colour_Distance
  274. *
  275. * INPUT
  276. *
  277. * OUTPUT
  278. *
  279. * RETURNS
  280. *
  281. * AUTHOR
  282. *
  283. * POV-Ray Team
  284. *
  285. * DESCRIPTION
  286. *
  287. * -
  288. *
  289. * CHANGES
  290. *
  291. * -
  292. *
  293. ******************************************************************************/
  294. DBL Colour_Distance (COLOUR colour1, COLOUR colour2)
  295. {
  296. return (fabs(colour1[RED] - colour2[RED]) +
  297. fabs(colour1[GREEN] - colour2[GREEN]) +
  298. fabs(colour1[BLUE] - colour2[BLUE]));
  299. }
  300. /*****************************************************************************
  301. *
  302. * FUNCTION
  303. *
  304. * Add_Colour
  305. *
  306. * INPUT
  307. *
  308. * OUTPUT
  309. *
  310. * RETURNS
  311. *
  312. * AUTHOR
  313. *
  314. * POV-Ray Team
  315. *
  316. * DESCRIPTION
  317. *
  318. * -
  319. *
  320. * CHANGES
  321. *
  322. * -
  323. *
  324. ******************************************************************************/
  325. void Add_Colour (COLOUR result, COLOUR colour1, COLOUR colour2)
  326. {
  327. result[RED] = colour1[RED] + colour2[RED];
  328. result[GREEN] = colour1[GREEN] + colour2[GREEN];
  329. result[BLUE] = colour1[BLUE] + colour2[BLUE];
  330. result[FILTER] = colour1[FILTER] + colour2[FILTER];
  331. result[TRANSM] = colour1[TRANSM] + colour2[TRANSM];
  332. }
  333. /*****************************************************************************
  334. *
  335. * FUNCTION
  336. *
  337. * Scale_Colour
  338. *
  339. * INPUT
  340. *
  341. * OUTPUT
  342. *
  343. * RETURNS
  344. *
  345. * AUTHOR
  346. *
  347. * POV-Ray Team
  348. *
  349. * DESCRIPTION
  350. *
  351. * -
  352. *
  353. * CHANGES
  354. *
  355. * -
  356. *
  357. ******************************************************************************/
  358. void Scale_Colour (COLOUR result, COLOUR colour, DBL factor)
  359. {
  360. result[RED] = colour[RED] * factor;
  361. result[GREEN] = colour[GREEN] * factor;
  362. result[BLUE] = colour[BLUE] * factor;
  363. result[FILTER] = colour[FILTER] * factor;
  364. result[TRANSM] = colour[TRANSM] * factor;
  365. }
  366. /*****************************************************************************
  367. *
  368. * FUNCTION
  369. *
  370. * Clip_Colour
  371. *
  372. * INPUT
  373. *
  374. * OUTPUT
  375. *
  376. * RETURNS
  377. *
  378. * AUTHOR
  379. *
  380. * POV-Ray Team
  381. *
  382. * DESCRIPTION
  383. *
  384. * -
  385. *
  386. * CHANGES
  387. *
  388. * -
  389. *
  390. ******************************************************************************/
  391. void Clip_Colour (COLOUR result, COLOUR colour)
  392. {
  393. if (colour[RED] > 1.0)
  394. {
  395. result[RED] = 1.0;
  396. }
  397. else
  398. {
  399. if (colour[RED] < 0.0)
  400. {
  401. result[RED] = 0.0;
  402. }
  403. else
  404. {
  405. result[RED] = colour[RED];
  406. }
  407. }
  408. if (colour[GREEN] > 1.0)
  409. {
  410. result[GREEN] = 1.0;
  411. }
  412. else
  413. {
  414. if (colour[GREEN] < 0.0)
  415. {
  416. result[GREEN] = 0.0;
  417. }
  418. else
  419. {
  420. result[GREEN] = colour[GREEN];
  421. }
  422. }
  423. if (colour[BLUE] > 1.0)
  424. {
  425. result[BLUE] = 1.0;
  426. }
  427. else
  428. {
  429. if (colour[BLUE] < 0.0)
  430. {
  431. result[BLUE] = 0.0;
  432. }
  433. else
  434. {
  435. result[BLUE] = colour[BLUE];
  436. }
  437. }
  438. if (colour[FILTER] > 1.0)
  439. {
  440. result[FILTER] = 1.0;
  441. }
  442. else
  443. {
  444. if (colour[FILTER] < 0.0)
  445. {
  446. result[FILTER] = 0.0;
  447. }
  448. else
  449. {
  450. result[FILTER] = colour[FILTER];
  451. }
  452. }
  453. if (colour[TRANSM] > 1.0)
  454. {
  455. result[TRANSM] = 1.0;
  456. }
  457. else
  458. {
  459. if (colour[TRANSM] < 0.0)
  460. {
  461. result[TRANSM] = 0.0;
  462. }
  463. else
  464. {
  465. result[TRANSM] = colour[TRANSM];
  466. }
  467. }
  468. }
  469. /*****************************************************************************
  470. *
  471. * FUNCTION
  472. *
  473. * Destroy_Blend_Map
  474. *
  475. * INPUT
  476. *
  477. * OUTPUT
  478. *
  479. * RETURNS
  480. *
  481. * AUTHOR
  482. *
  483. * POV-Ray Team
  484. *
  485. * DESCRIPTION
  486. *
  487. * -
  488. *
  489. * CHANGES
  490. *
  491. * -
  492. *
  493. ******************************************************************************/
  494. void Destroy_Blend_Map (BLEND_MAP *BMap)
  495. {
  496. int i;
  497. if (BMap != NULL)
  498. {
  499. if (--(BMap->Users) == 0)
  500. {
  501. for (i = 0; i < BMap->Number_Of_Entries; i++)
  502. {
  503. switch (BMap->Type)
  504. {
  505. case PIGMENT_TYPE:
  506. case DENSITY_TYPE:
  507. Destroy_Pigment(BMap->Blend_Map_Entries[i].Vals.Pigment);
  508. break;
  509. case NORMAL_TYPE:
  510. Destroy_Tnormal(BMap->Blend_Map_Entries[i].Vals.Tnormal);
  511. break;
  512. case TEXTURE_TYPE:
  513. Destroy_Textures(BMap->Blend_Map_Entries[i].Vals.Texture);
  514. }
  515. }
  516. POV_FREE (BMap->Blend_Map_Entries);
  517. POV_FREE (BMap);
  518. }
  519. }
  520. }