Matrix.c 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. /*
  2. * The Python Imaging Library
  3. * $Id$
  4. *
  5. * colour and luminance matrix transforms
  6. *
  7. * history:
  8. * 1996-05-18 fl: created (brute force implementation)
  9. *
  10. * Copyright (c) Fredrik Lundh 1996.
  11. * Copyright (c) Secret Labs AB 1997.
  12. *
  13. * See the README file for information on usage and redistribution.
  14. */
  15. #include "Imaging.h"
  16. #define CLIPF(v) ((v <= 0.0) ? 0 : (v >= 255.0F) ? 255 : (UINT8) v)
  17. Imaging
  18. ImagingConvertMatrix(Imaging im, const char *mode, float m[])
  19. {
  20. Imaging imOut;
  21. int x, y;
  22. /* Assume there's enough data in the buffer */
  23. if (!im)
  24. return (Imaging) ImagingError_ModeError();
  25. if (strcmp(mode, "L") == 0 && im->bands == 3) {
  26. imOut = ImagingNewDirty("L", im->xsize, im->ysize);
  27. if (!imOut)
  28. return NULL;
  29. for (y = 0; y < im->ysize; y++) {
  30. UINT8* in = (UINT8*) im->image[y];
  31. UINT8* out = (UINT8*) imOut->image[y];
  32. for (x = 0; x < im->xsize; x++) {
  33. float v = m[0]*in[0] + m[1]*in[1] + m[2]*in[2] + m[3] + 0.5;
  34. out[x] = CLIPF(v);
  35. in += 4;
  36. }
  37. }
  38. } else if (strlen(mode) == 3 && im->bands == 3) {
  39. imOut = ImagingNewDirty(mode, im->xsize, im->ysize);
  40. if (!imOut)
  41. return NULL;
  42. for (y = 0; y < im->ysize; y++) {
  43. UINT8* in = (UINT8*) im->image[y];
  44. UINT8* out = (UINT8*) imOut->image[y];
  45. for (x = 0; x < im->xsize; x++) {
  46. float v0 = m[0]*in[0] + m[1]*in[1] + m[2]*in[2] + m[3] + 0.5;
  47. float v1 = m[4]*in[0] + m[5]*in[1] + m[6]*in[2] + m[7] + 0.5;
  48. float v2 = m[8]*in[0] + m[9]*in[1] + m[10]*in[2] + m[11] + 0.5;
  49. out[0] = CLIPF(v0);
  50. out[1] = CLIPF(v1);
  51. out[2] = CLIPF(v2);
  52. in += 4; out += 4;
  53. }
  54. }
  55. } else
  56. return (Imaging) ImagingError_ModeError();
  57. return imOut;
  58. }