Fill.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. /*
  2. * The Python Imaging Library
  3. * $Id$
  4. *
  5. * fill image with constant pixel value
  6. *
  7. * history:
  8. * 95-11-26 fl moved from Imaging.c
  9. * 96-05-17 fl added radial fill, renamed wedge to linear
  10. * 98-06-23 fl changed ImageFill signature
  11. *
  12. * Copyright (c) Secret Labs AB 1997-98. All rights reserved.
  13. * Copyright (c) Fredrik Lundh 1995-96.
  14. *
  15. * See the README file for information on usage and redistribution.
  16. */
  17. #include "Imaging.h"
  18. #include "math.h"
  19. Imaging
  20. ImagingFill(Imaging im, const void* colour)
  21. {
  22. int x, y;
  23. ImagingSectionCookie cookie;
  24. if (im->type == IMAGING_TYPE_SPECIAL) {
  25. /* use generic API */
  26. ImagingAccess access = ImagingAccessNew(im);
  27. if (access) {
  28. for (y = 0; y < im->ysize; y++)
  29. for (x = 0; x < im->xsize; x++)
  30. access->put_pixel(im, x, y, colour);
  31. ImagingAccessDelete(im, access);
  32. } else {
  33. /* wipe the image */
  34. for (y = 0; y < im->ysize; y++)
  35. memset(im->image[y], 0, im->linesize);
  36. }
  37. } else {
  38. INT32 c = 0L;
  39. ImagingSectionEnter(&cookie);
  40. memcpy(&c, colour, im->pixelsize);
  41. if (im->image32 && c != 0L) {
  42. for (y = 0; y < im->ysize; y++)
  43. for (x = 0; x < im->xsize; x++)
  44. im->image32[y][x] = c;
  45. } else {
  46. unsigned char cc = (unsigned char) *(UINT8*) colour;
  47. for (y = 0; y < im->ysize; y++)
  48. memset(im->image[y], cc, im->linesize);
  49. }
  50. ImagingSectionLeave(&cookie);
  51. }
  52. return im;
  53. }
  54. Imaging
  55. ImagingFillLinearGradient(const char *mode)
  56. {
  57. Imaging im;
  58. int y;
  59. if (strlen(mode) != 1) {
  60. return (Imaging) ImagingError_ModeError();
  61. }
  62. im = ImagingNewDirty(mode, 256, 256);
  63. if (!im) {
  64. return NULL;
  65. }
  66. for (y = 0; y < 256; y++) {
  67. memset(im->image8[y], (unsigned char) y, 256);
  68. }
  69. return im;
  70. }
  71. Imaging
  72. ImagingFillRadialGradient(const char *mode)
  73. {
  74. Imaging im;
  75. int x, y;
  76. int d;
  77. if (strlen(mode) != 1) {
  78. return (Imaging) ImagingError_ModeError();
  79. }
  80. im = ImagingNewDirty(mode, 256, 256);
  81. if (!im) {
  82. return NULL;
  83. }
  84. for (y = 0; y < 256; y++) {
  85. for (x = 0; x < 256; x++) {
  86. d = (int) sqrt((double) ((x-128)*(x-128) + (y-128)*(y-128)) * 2.0);
  87. if (d >= 255) {
  88. im->image8[y][x] = 255;
  89. } else {
  90. im->image8[y][x] = d;
  91. }
  92. }
  93. }
  94. return im;
  95. }