Chops.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. /*
  2. * The Python Imaging Library
  3. * $Id$
  4. *
  5. * basic channel operations
  6. *
  7. * history:
  8. * 1996-03-28 fl Created
  9. * 1996-08-13 fl Added and/or/xor for "1" images
  10. * 1996-12-14 fl Added add_modulo, sub_modulo
  11. * 2005-09-10 fl Fixed output values from and/or/xor
  12. *
  13. * Copyright (c) 1996 by Fredrik Lundh.
  14. * Copyright (c) 1997 by Secret Labs AB.
  15. *
  16. * See the README file for details on usage and redistribution.
  17. */
  18. #include "Imaging.h"
  19. #define CHOP(operation, mode)\
  20. int x, y;\
  21. Imaging imOut;\
  22. imOut = create(imIn1, imIn2, mode);\
  23. if (!imOut)\
  24. return NULL;\
  25. for (y = 0; y < imOut->ysize; y++) {\
  26. UINT8* out = (UINT8*) imOut->image[y];\
  27. UINT8* in1 = (UINT8*) imIn1->image[y];\
  28. UINT8* in2 = (UINT8*) imIn2->image[y];\
  29. for (x = 0; x < imOut->linesize; x++) {\
  30. int temp = operation;\
  31. if (temp <= 0)\
  32. out[x] = 0;\
  33. else if (temp >= 255)\
  34. out[x] = 255;\
  35. else\
  36. out[x] = temp;\
  37. }\
  38. }\
  39. return imOut;
  40. #define CHOP2(operation, mode)\
  41. int x, y;\
  42. Imaging imOut;\
  43. imOut = create(imIn1, imIn2, mode);\
  44. if (!imOut)\
  45. return NULL;\
  46. for (y = 0; y < imOut->ysize; y++) {\
  47. UINT8* out = (UINT8*) imOut->image[y];\
  48. UINT8* in1 = (UINT8*) imIn1->image[y];\
  49. UINT8* in2 = (UINT8*) imIn2->image[y];\
  50. for (x = 0; x < imOut->linesize; x++) {\
  51. out[x] = operation;\
  52. }\
  53. }\
  54. return imOut;
  55. static Imaging
  56. create(Imaging im1, Imaging im2, char* mode)
  57. {
  58. int xsize, ysize;
  59. if (!im1 || !im2 || im1->type != IMAGING_TYPE_UINT8 ||
  60. (mode != NULL && (strcmp(im1->mode, "1") || strcmp(im2->mode, "1"))))
  61. return (Imaging) ImagingError_ModeError();
  62. if (im1->type != im2->type ||
  63. im1->bands != im2->bands)
  64. return (Imaging) ImagingError_Mismatch();
  65. xsize = (im1->xsize < im2->xsize) ? im1->xsize : im2->xsize;
  66. ysize = (im1->ysize < im2->ysize) ? im1->ysize : im2->ysize;
  67. return ImagingNewDirty(im1->mode, xsize, ysize);
  68. }
  69. Imaging
  70. ImagingChopLighter(Imaging imIn1, Imaging imIn2)
  71. {
  72. CHOP((in1[x] > in2[x]) ? in1[x] : in2[x], NULL);
  73. }
  74. Imaging
  75. ImagingChopDarker(Imaging imIn1, Imaging imIn2)
  76. {
  77. CHOP((in1[x] < in2[x]) ? in1[x] : in2[x], NULL);
  78. }
  79. Imaging
  80. ImagingChopDifference(Imaging imIn1, Imaging imIn2)
  81. {
  82. CHOP(abs((int) in1[x] - (int) in2[x]), NULL);
  83. }
  84. Imaging
  85. ImagingChopMultiply(Imaging imIn1, Imaging imIn2)
  86. {
  87. CHOP((int) in1[x] * (int) in2[x] / 255, NULL);
  88. }
  89. Imaging
  90. ImagingChopScreen(Imaging imIn1, Imaging imIn2)
  91. {
  92. CHOP(255 - ((int) (255 - in1[x]) * (int) (255 - in2[x])) / 255, NULL);
  93. }
  94. Imaging
  95. ImagingChopAdd(Imaging imIn1, Imaging imIn2, float scale, int offset)
  96. {
  97. CHOP(((int) in1[x] + (int) in2[x]) / scale + offset, NULL);
  98. }
  99. Imaging
  100. ImagingChopSubtract(Imaging imIn1, Imaging imIn2, float scale, int offset)
  101. {
  102. CHOP(((int) in1[x] - (int) in2[x]) / scale + offset, NULL);
  103. }
  104. Imaging
  105. ImagingChopAnd(Imaging imIn1, Imaging imIn2)
  106. {
  107. CHOP2((in1[x] && in2[x]) ? 255 : 0, "1");
  108. }
  109. Imaging
  110. ImagingChopOr(Imaging imIn1, Imaging imIn2)
  111. {
  112. CHOP2((in1[x] || in2[x]) ? 255 : 0, "1");
  113. }
  114. Imaging
  115. ImagingChopXor(Imaging imIn1, Imaging imIn2)
  116. {
  117. CHOP2(((in1[x] != 0) ^ (in2[x] != 0)) ? 255 : 0, "1");
  118. }
  119. Imaging
  120. ImagingChopAddModulo(Imaging imIn1, Imaging imIn2)
  121. {
  122. CHOP2(in1[x] + in2[x], NULL);
  123. }
  124. Imaging
  125. ImagingChopSubtractModulo(Imaging imIn1, Imaging imIn2)
  126. {
  127. CHOP2(in1[x] - in2[x], NULL);
  128. }