Advertisement
Guest User

Untitled

a guest
Mar 20th, 2019
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.29 KB | None | 0 0
  1. /* ************************************************************************** */
  2. /* */
  3. /* ::: :::::::: */
  4. /* modify.c :+: :+: :+: */
  5. /* +:+ +:+ +:+ */
  6. /* By: Diana <Diana@student.42.fr> +#+ +:+ +#+ */
  7. /* +#+#+#+#+#+ +#+ */
  8. /* Created: 2019/03/04 21:55:30 by rfunk #+# #+# */
  9. /* Updated: 2019/03/20 11:48:07 by Diana ### ########.fr */
  10. /* */
  11. /* ************************************************************************** */
  12.  
  13. #include "../includes/fractol.h"
  14.  
  15. //------------ADITIONALS-------------
  16. unsigned rgb2hex(rgb RGB)
  17. {
  18. return (RGB.r<<16) | (RGB.g<<8) | RGB.b;
  19. }
  20.  
  21. hsv rgb2hsv(rgb in)
  22. {
  23. hsv out;
  24. double min, max, delta;
  25.  
  26. min = in.r < in.g ? in.r : in.g;
  27. min = min < in.b ? min : in.b;
  28.  
  29. max = in.r > in.g ? in.r : in.g;
  30. max = max > in.b ? max : in.b;
  31.  
  32. out.v = max; // v
  33. delta = max - min;
  34. if (delta < 0.00001)
  35. {
  36. out.s = 0;
  37. out.h = 0; // undefined, maybe nan?
  38. return out;
  39. }
  40. if( max > 0.0 ) { // NOTE: if Max is == 0, this divide would cause a crash
  41. out.s = (delta / max); // s
  42. } else {
  43. // if max is 0, then r = g = b = 0
  44. // s = 0, h is undefined
  45. out.s = 0.0;
  46. out.h = NAN; // its now undefined
  47. return out;
  48. }
  49. if( in.r >= max ) // > is bogus, just keeps compilor happy
  50. out.h = ( in.g - in.b ) / delta; // between yellow & magenta
  51. else
  52. if( in.g >= max )
  53. out.h = 2.0 + ( in.b - in.r ) / delta; // between cyan & yellow
  54. else
  55. out.h = 4.0 + ( in.r - in.g ) / delta; // between magenta & cyan
  56.  
  57. out.h *= 60.0; // degrees
  58.  
  59. if( out.h < 0.0 )
  60. out.h += 360.0;
  61.  
  62. return out;
  63. }
  64.  
  65. rgb hsv2rgb(hsv HSV)
  66. {
  67. rgb RGB;
  68. double H = HSV.h, S = HSV.s, V = HSV.v,
  69. fract;
  70. int P, Q, T;
  71.  
  72. (H == 360.)?(H = 0.):(H /= 60.);
  73. fract = H - floor(H);
  74. P = (int)255*V*(1. - S);
  75. Q = (int)255*V*(1. - S*fract);
  76. T = (int)255*V*(1. - S*(1. - fract));
  77. V *= 255;
  78. if (0. <= H && H < 1.)
  79. RGB = (rgb){.r = V, .g = T, .b = P};
  80. else if (1. <= H && H < 2.)
  81. RGB = (rgb){.r = Q, .g = V, .b = P};
  82. else if (2. <= H && H < 3.)
  83. RGB = (rgb){.r = P, .g = V, .b = T};
  84. else if (3. <= H && H < 4.)
  85. RGB = (rgb){.r = P, .g = Q, .b = V};
  86. else if (4. <= H && H < 5.)
  87. RGB = (rgb){.r = T, .g = P, .b = V};
  88. else if (5. <= H && H < 6.)
  89. RGB = (rgb){.r = V, .g = P, .b = Q};
  90. else
  91. RGB = (rgb){.r = 0., .g = 0., .b = 0.};
  92.  
  93. return RGB;
  94. }
  95.  
  96. int get_light(int start, int end, double percentage)
  97. {
  98. return ((int)((1 - percentage) * start + percentage * end));
  99. }
  100.  
  101. double percent(int start, int end, int current)
  102. {
  103. double placement;
  104. double distance;
  105.  
  106. placement = current - start;
  107. distance = end - start;
  108. return ((distance == 0) ? 1.0 : (placement / distance));
  109. }
  110.  
  111. // todo maybe remove
  112. int swap_bits_if(int color)
  113. {
  114. int bit1;
  115. int bit2;
  116.  
  117. bit1 = (color & 0xFF) >> 1;
  118. bit2 = (color & 0xFF) >> 2;
  119. if (bit1 > bit2)
  120. {
  121. color = bit1;
  122. bit1 = bit2;
  123. bit2 = color;
  124. color = ((bit1 << 2) | (bit2 << 1));
  125. }
  126.  
  127. return (color);
  128. }
  129.  
  130. //-------------------------------------
  131.  
  132. //----------COLOR AlGORITHMS-----------
  133.  
  134. // multi gradient
  135. int hsv_color(t_screen *screen, int it, int arg)
  136. {
  137. hsv h;
  138. rgb RGB;
  139. int hue;
  140. int temp = arg;//remove
  141. temp++;
  142.  
  143. //replace shit
  144. if (screen->color_scheme.hue_offset >= 360)
  145. screen->color_scheme.hue_offset -= 360;
  146. else if (screen->color_scheme.hue_offset < 0)
  147. screen->color_scheme.hue_offset += 360;
  148. hue = ((double)it/screen->itrs * 360) + screen->color_scheme.hue_offset;
  149. hue >= 360 ? hue -= 360 : 0;
  150. hue < 0 ? hue += 360 : 0;
  151. h = (hsv) { hue, .s = screen->color_scheme.saturation, .v = screen->color_scheme.brightness_v};
  152. RGB = (hsv2rgb(h));
  153. return (rgb2hex(RGB));
  154. }
  155.  
  156. // color jump (one spector)
  157. int color_jump(t_screen *screen, int it, int arg)
  158. {
  159. hsv h;
  160. rgb RGB;
  161. int temp = arg;//remove
  162. temp++;
  163. double tmp;
  164.  
  165. //replace shit
  166. if (screen->color_scheme.hue_offset >= 360)
  167. screen->color_scheme.hue_offset -= 360;
  168. else if (screen->color_scheme.hue_offset < 0)
  169. screen->color_scheme.hue_offset += 360;
  170. tmp = ((double)(it % 10))/10;
  171. h = (hsv) { screen->color_scheme.hue_offset, .s = tmp, .v = tmp};
  172. RGB = (hsv2rgb(h));
  173. return (rgb2hex(RGB));
  174. }
  175.  
  176.  
  177. int color_jump2(t_screen *screen, int it, int arg)
  178. {
  179. hsv h;
  180. rgb RGB;
  181. int hue;
  182. int temp = arg;//remove
  183. temp++;
  184.  
  185. //replace shit
  186. if (screen->color_scheme.hue_offset >= 360)
  187. screen->color_scheme.hue_offset -= 360;
  188. else if (screen->color_scheme.hue_offset < 0)
  189. screen->color_scheme.hue_offset += 360;
  190. hue = ((it % 5)) + screen->color_scheme.hue_offset;
  191. hue >= 360 ? hue -= 360 : 0;
  192. hue < 0 ? hue += 360 : 0;
  193. h = (hsv) { 60, .s = screen->color_scheme.saturation, .v = ((double)(it % 10))/10};
  194. RGB = (hsv2rgb(h));
  195. return (rgb2hex(RGB));
  196. }
  197.  
  198. // absolute gradient design (+ inverted maybe)
  199. int absolute_gradient(t_screen *screen, int it, int color)
  200. {
  201. hsv h;
  202. rgb RGB;
  203. double br_v;
  204.  
  205. int temp = color;
  206. temp++;//remove
  207.  
  208. //replace shit
  209. if (screen->color_scheme.hue_offset >= 360)
  210. screen->color_scheme.hue_offset -= 360;
  211. else if (screen->color_scheme.hue_offset < 0)
  212. screen->color_scheme.hue_offset += 360;
  213. if (screen->color_scheme.direction == 1)
  214. br_v = 1 - (double)it/screen->itrs;
  215. else
  216. br_v = (double)it/screen->itrs;
  217. h = (hsv) { screen->color_scheme.hue_offset, .s = screen->color_scheme.saturation, .v = br_v};
  218. RGB = (hsv2rgb(h));
  219. return (rgb2hex(RGB));
  220. }
  221.  
  222. // this method can be use only if one ore more R G B bytes are FF (voodoo magic)
  223. int material_des(t_screen *screen, int iteration, int color)
  224. {
  225. rgb RGB;
  226. double percentage;
  227.  
  228. percentage = percent(0,screen->itrs / screen->extrude, iteration);
  229. while (percentage > 1)
  230. percentage -= 1;
  231. RGB.r = get_light((color >> 16) & 0xFF, (0 >> 16) & 0xFF, percentage);
  232. RGB.g = get_light((color >> 8) & 0xFF, (0 >> 8) & 0xFF, percentage);
  233. RGB.b = get_light(color & 0xFF, 0 & 0xFF, percentage);
  234. return (((rgb2hex(RGB) & color)));
  235. }
  236.  
  237. int (*funcs [])(t_screen*, double, double) = {
  238. julia,
  239. mandelbrot
  240. };
  241.  
  242. int (*color_scheme [])(t_screen*, int, int) = {
  243. hsv_color,
  244. absolute_gradient,
  245. color_jump,
  246. material_des
  247. };
  248.  
  249. void *foreach_pixel(void *scn)
  250. {
  251. t_screen *screen;
  252. int i;
  253. int tmp;
  254. int it;
  255.  
  256. screen = (t_screen *)scn;
  257. i = 0;
  258. while (i < screen->width)
  259. {
  260. tmp = screen->start_r;
  261. while (tmp < screen->end_r)
  262. {
  263. if ((it = funcs[screen->render_fr](screen, i, tmp)))
  264. set_pixel(screen, i + screen->margin_x, tmp + screen->margin_y,
  265. color_scheme[screen->color_scheme.index](screen, it, screen->color_scheme.base_color));
  266. else
  267. set_pixel(screen, i + screen->margin_x, tmp + screen->margin_y, 0);
  268. tmp++;
  269. }
  270. i++;
  271. }
  272. return (screen);
  273. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement