You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

133 lines
3.3 KiB

  1. /*
  2. * libpipi Proper image processing implementation library
  3. * Copyright (c) 2004-2008 Sam Hocevar <sam@zoy.org>
  4. * 2008 Jean-Yves Lamoureux <jylam@lnxscene.org
  5. * All Rights Reserved
  6. *
  7. * $Id$
  8. *
  9. * This library is free software. It comes without any warranty, to
  10. * the extent permitted by applicable law. You can redistribute it
  11. * and/or modify it under the terms of the Do What The Fuck You Want
  12. * To Public License, Version 2, as published by Sam Hocevar. See
  13. * http://sam.zoy.org/wtfpl/COPYING for more details.
  14. */
  15. /*
  16. * aline_template.c: antialiased (Wu) line rendering template
  17. */
  18. float x1 = s->x1, y1 = s->y1, x2 = s->x2, y2 = s->y2;
  19. float g, xd, yd, xgap, xend, yend, xf, yf, val1, val2;
  20. int x, y, ix1, ix2, iy1, iy2;
  21. xd = x2 - x1;
  22. yd = y2 - y1;
  23. /* "Horizontal" line (X greater than Y)*/
  24. if (fabsf(xd) > fabsf(yd))
  25. {
  26. if (x1 > x2)
  27. {
  28. float tmp;
  29. tmp = x1; x1 = x2; x2 = tmp;
  30. tmp = y1; y1 = y2; y2 = tmp;
  31. xd = (x2-x1);
  32. yd = (y2-y1);
  33. }
  34. g = yd/xd;
  35. xend = truncf(x1+0.5);
  36. yend = y1 + g*(xend-x1);
  37. xgap = fractinvf(x1+0.5);
  38. ix1 = (int)xend;
  39. iy1 = (int)yend;
  40. val1 = fractinvf(yend)*xgap;
  41. val2 = fractf(yend)*xgap;
  42. PLOT(ix1, iy1, val1);
  43. PLOT(ix1, (iy1+1)<y1?(iy1+1):iy1, val2);
  44. yf = yend+g;
  45. xend = truncf(x2+0.5);
  46. yend = y2 + g*(xend-x2);
  47. xgap = fractinvf(x2-0.5);
  48. ix2 = (int)xend;
  49. iy2 = (int)yend;
  50. val1 = fractinvf(yend)*xgap;
  51. val2 = fractf(yend)*xgap;
  52. PLOT(ix2, iy2, val1);
  53. PLOT(ix2, iy2+1<y2?iy2+1:iy2, val2);
  54. for (x = (ix1+1); x < ix2; x++)
  55. {
  56. float focus;
  57. val1 = fractinvf(yf);
  58. val2 = fractf(yf);
  59. focus = (1.0 - fabsf(val1-val2));
  60. val1 += 0.3*focus;
  61. val2 += 0.3*focus;
  62. PLOT(x, yf, val1);
  63. PLOT(x, (yf+1)<y1?(yf+1):yf, val2);
  64. yf = yf + g;
  65. }
  66. }
  67. /* "Vertical" line (Y greater than X)*/
  68. else
  69. {
  70. if (x1 > x2)
  71. {
  72. float tmp;
  73. tmp = x1; x1 = x2; x2 = tmp;
  74. tmp = y1; y1 = y2; y2 = tmp;
  75. xd = (x2-x1);
  76. yd = (y2-y1);
  77. }
  78. g = xd/yd;
  79. xend = truncf(x1+0.5);
  80. yend = y1 + g*(xend-x1);
  81. xgap = fractf(x1+0.5);
  82. ix1 = (int)xend;
  83. iy1 = (int)yend;
  84. val1 = fractinvf(yend)*xgap;
  85. val2 = fractf(yend)*xgap;
  86. PLOT(ix1, iy1, val1);
  87. PLOT(ix1, (iy1+1)<y1?(iy1+1):iy1, val2);
  88. xf = xend + g;
  89. xend = truncf(x2+0.5);
  90. yend = y2 + g*(xend-x2);
  91. xgap = fractinvf(x2-0.5);
  92. ix2 = (int)xend;
  93. iy2 = (int)yend;
  94. val1 = fractinvf(yend)*xgap;
  95. val2 = fractf(yend)*xgap;
  96. PLOT(ix2, iy2, val1);
  97. PLOT(ix2, (iy2+1)<y2?(iy2+1):iy2, val2);
  98. for (y = (iy1+1); y < iy2; y++)
  99. {
  100. float focus;
  101. int vx = xf;
  102. val1 = fractinvf(xf);
  103. val2 = fractf(xf);
  104. focus = (1.0 - fabsf(val1-val2));
  105. val1 += 0.3*focus;
  106. val2 += 0.3*focus;
  107. PLOT(vx, y, val1);
  108. vx++;
  109. PLOT(vx, y, val2);
  110. xf = xf + g;
  111. }
  112. }