column_shift.c 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. #include <stdlib.h>
  2. #include <grass/gis.h>
  3. #include <grass/raster.h>
  4. #include "expression.h"
  5. #include "globals.h"
  6. void column_shift(void *buf, int res_type, int col)
  7. {
  8. CELL *ibuf = buf;
  9. FCELL *fbuf = buf;
  10. DCELL *dbuf = buf;
  11. int i;
  12. /* if column offset, copy cell to itself shifting by col */
  13. if (col > 0) {
  14. switch (res_type) {
  15. case CELL_TYPE:
  16. for (i = 0; i < columns - col; i++) {
  17. if (IS_NULL_C(&ibuf[i + col]))
  18. SET_NULL_C(&ibuf[i]);
  19. else
  20. ibuf[i] = ibuf[i + col];
  21. }
  22. for (; i < columns; i++)
  23. SET_NULL_C(&ibuf[i]);
  24. break;
  25. case FCELL_TYPE:
  26. for (i = 0; i < columns - col; i++) {
  27. if (IS_NULL_F(&fbuf[i + col]))
  28. SET_NULL_F(&fbuf[i]);
  29. else
  30. fbuf[i] = fbuf[i + col];
  31. }
  32. for (; i < columns; i++)
  33. SET_NULL_F(&fbuf[i]);
  34. break;
  35. case DCELL_TYPE:
  36. for (i = 0; i < columns - col; i++) {
  37. if (IS_NULL_D(&dbuf[i + col]))
  38. SET_NULL_D(&dbuf[i]);
  39. else
  40. dbuf[i] = dbuf[i + col];
  41. }
  42. for (; i < columns; i++)
  43. SET_NULL_D(&dbuf[i]);
  44. break;
  45. }
  46. }
  47. else if (col < 0) {
  48. col = -col;
  49. switch (res_type) {
  50. case CELL_TYPE:
  51. for (i = columns - 1; i >= col; i--) {
  52. if (IS_NULL_C(&ibuf[i - col]))
  53. SET_NULL_C(&ibuf[i]);
  54. else
  55. ibuf[i] = ibuf[i - col];
  56. }
  57. for (; i >= 0; i--)
  58. SET_NULL_C(&ibuf[i]);
  59. break;
  60. case FCELL_TYPE:
  61. for (i = columns - 1; i >= col; i--) {
  62. if (IS_NULL_F(&fbuf[i - col]))
  63. SET_NULL_F(&fbuf[i]);
  64. else
  65. fbuf[i] = fbuf[i - col];
  66. }
  67. for (; i >= 0; i--)
  68. SET_NULL_F(&fbuf[i]);
  69. break;
  70. case DCELL_TYPE:
  71. for (i = columns - 1; i >= col; i--) {
  72. if (IS_NULL_D(&dbuf[i - col]))
  73. SET_NULL_D(&dbuf[i]);
  74. else
  75. dbuf[i] = dbuf[i - col];
  76. }
  77. for (; i >= 0; i--)
  78. SET_NULL_D(&dbuf[i]);
  79. break;
  80. }
  81. }
  82. }