image.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <bio.h>
  4. #include "sky.h"
  5. char rad28[] = "0123456789abcdefghijklmnopqr";
  6. Picture*
  7. image(Angle ra, Angle dec, Angle wid, Angle hig)
  8. {
  9. Pix *p;
  10. uchar *b, *up;
  11. int i, j, sx, sy, x, y;
  12. char file[50];
  13. Picture *pic;
  14. Img* ip;
  15. int lowx, lowy, higx, higy;
  16. int slowx, slowy, shigx, shigy;
  17. Header *h;
  18. Angle d, bd;
  19. Plate *pp, *bp;
  20. if(gam.gamma == 0)
  21. gam.gamma = -1;
  22. if(gam.max == gam.min) {
  23. gam.max = 17600;
  24. gam.min = 2500;
  25. }
  26. gam.absgamma = gam.gamma;
  27. gam.neg = 0;
  28. if(gam.absgamma < 0) {
  29. gam.absgamma = -gam.absgamma;
  30. gam.neg = 1;
  31. }
  32. gam.mult1 = 1. / (gam.max - gam.min);
  33. gam.mult2 = 255. * gam.mult1;
  34. if(nplate == 0)
  35. getplates();
  36. bp = 0;
  37. bd = 0;
  38. for(i=0; i<nplate; i++) {
  39. pp = &plate[i];
  40. d = dist(ra, dec, pp->ra, pp->dec);
  41. if(bp == 0 || d < bd) {
  42. bp = pp;
  43. bd = d;
  44. }
  45. }
  46. if(debug)
  47. Bprint(&bout, "best plate: %s %s disk %d %s\n",
  48. hms(bp->ra), dms(bp->dec),
  49. bp->disk, bp->rgn);
  50. h = getheader(bp->rgn);
  51. xypos(h, ra, dec, 0, 0);
  52. if(wid <= 0 || hig <= 0) {
  53. lowx = h->x;
  54. lowy = h->y;
  55. lowx = (lowx/500) * 500;
  56. lowy = (lowy/500) * 500;
  57. higx = lowx + 500;
  58. higy = lowy + 500;
  59. } else {
  60. lowx = h->x - wid*ARCSECONDS_PER_RADIAN*1000 /
  61. (h->param[Pxpixelsz]*h->param[Ppltscale]*2);
  62. lowy = h->y - hig*ARCSECONDS_PER_RADIAN*1000 /
  63. (h->param[Pypixelsz]*h->param[Ppltscale]*2);
  64. higx = h->x + wid*ARCSECONDS_PER_RADIAN*1000 /
  65. (h->param[Pxpixelsz]*h->param[Ppltscale]*2);
  66. higy = h->y + hig*ARCSECONDS_PER_RADIAN*1000 /
  67. (h->param[Pypixelsz]*h->param[Ppltscale]*2);
  68. }
  69. free(h);
  70. if(lowx < 0) lowx = 0;
  71. if(higx < 0) higx = 0;
  72. if(lowy < 0) lowy = 0;
  73. if(higy < 0) higy = 0;
  74. if(lowx > 14000) lowx = 14000;
  75. if(higx > 14000) higx = 14000;
  76. if(lowy > 14000) lowy = 14000;
  77. if(higy > 14000) higy = 14000;
  78. if(debug)
  79. Bprint(&bout, "xy on plate: %d,%d %d,%d\n",
  80. lowx,lowy, higx, higy);
  81. if(lowx >= higx || lowy >=higy) {
  82. Bprint(&bout, "no image found\n");
  83. return 0;
  84. }
  85. b = malloc((higx-lowx)*(higy-lowy)*sizeof(*b));
  86. if(b == 0) {
  87. emalloc:
  88. fprint(2, "malloc error\n");
  89. return 0;
  90. }
  91. memset(b, 0, (higx-lowx)*(higy-lowy)*sizeof(*b));
  92. slowx = lowx/500;
  93. shigx = (higx-1)/500;
  94. slowy = lowy/500;
  95. shigy = (higy-1)/500;
  96. for(sx=slowx; sx<=shigx; sx++)
  97. for(sy=slowy; sy<=shigy; sy++) {
  98. if(sx < 0 || sx >= nelem(rad28) || sy < 0 || sy >= nelem(rad28)) {
  99. fprint(2, "bad subplate %d %d\n", sy, sx);
  100. free(b);
  101. return 0;
  102. }
  103. sprint(file, "%s/%s/%s.%c%c",
  104. dssmount(bp->disk),
  105. bp->rgn, bp->rgn,
  106. rad28[sy],
  107. rad28[sx]);
  108. ip = dssread(file);
  109. if(ip == 0) {
  110. fprint(2, "can't read %s: %r\n", file);
  111. free(b);
  112. return 0;
  113. }
  114. x = sx*500;
  115. y = sy*500;
  116. for(j=0; j<ip->ny; j++) {
  117. if(y+j < lowy || y+j >= higy)
  118. continue;
  119. p = &ip->a[j*ip->ny];
  120. up = b + (higy - (y+j+1))*(higx-lowx) + (x - lowx);
  121. for(i=0; i<ip->nx; i++) {
  122. if(x+i >= lowx && x+i < higx)
  123. *up = dogamma(*p);
  124. up++;
  125. p += 1;
  126. }
  127. }
  128. free(ip);
  129. }
  130. pic = malloc(sizeof(Picture));
  131. if(pic == 0){
  132. free(b);
  133. goto emalloc;
  134. }
  135. pic->minx = lowx;
  136. pic->miny = lowy;
  137. pic->maxx = higx;
  138. pic->maxy = higy;
  139. pic->data = b;
  140. strcpy(pic->name, bp->rgn);
  141. return pic;
  142. }