/************/ /* mktpng.c */ /**************************************************************/ /* to compile: */ /* gcc mktpng.c -o mktpng -L/home/SHARE/lib -lgm -lm -lpng */ /**************************************************************/ /* Usage: mktpng ncc frm:lly:msz spec path [outfile] */ /*------------------------------------------------------------*/ /* ncc : nc[:iorg:korg] */ /* nc : Coordinate number */ /* iorg : Origin Lat. (minutes) */ /* korg : Origin Long. (minutes) */ /* frm : llx:lly:msz */ /* llx : Bottom X-coordinate (m) */ /* lly : Left side Y-coordinate (m) */ /* msz : Unit raster size (m) */ /* spec : ift:igr[:llu:p1:p2] */ /* ift : File type (1-4 or 0) */ /* igr : Geodetic 1:WGS or 2:Tokyo */ /* llu : LatLonUnit 1:min. or 2:deg. */ /* p1 : Data position for Lat. */ /* p2 : Data position for Long. */ /* path : Input data file path */ /* outfile: PNG output filename */ /* if omitted, output to stdout stream */ /**************************************************************/ #include #include #include #include #include main(int argc, char *argv[]) { int nc=0, iorg=0, korg=0, ift=0, igr=0, llu=0, p1=0, p2=0; int ncm, llx, lly, msz, i, j, k; double xs, ys, dm, dlat, dlon, d1, d2, vlat, vlon, valt, xn, ye; int ii, jj, ixs, iys, n, ls; char buf[151], fnam[81]; char fmt[91] = "%*s%*s%*s%*s%*s%*s%*s%*s%*s%*s%*s%*s%*s%*s%*s" "%*s%*s%*s%*s%*s%*s%*s%*s%*s%*s%*s%*s%*s%*s%*s"; FILE *fin, *fout; png_structp png_ptr; png_infop info_ptr; png_bytep row_pointers[441]; png_color_8 sig_bit; unsigned char *bm, *pb, cb; if ((bm=(unsigned char *)calloc(651*441,1)) == NULL) { printf("mktpng: malloc (bitmap) fail\n"); exit(1); } row_pointers[440] = bm; for (i=440; i>0; i--) { row_pointers[i-1] = row_pointers[i] + 651; } sig_bit.gray = 8; if (argc < 5) { printf("mktpng: parameters missing\n"); exit(1); } sscanf(argv[1], "%d:%d:%d", &nc, &iorg, &korg); ncm = (nc<200)? nc: (nc-200); if ((ncm>=1) && (ncm<=60)) { iorg = 0; korg = (ncm-30)*360 - 180; } else if (ncm == 61) { iorg = +5400; korg = 0; } else if (ncm == 62) { iorg = -5400; korg = 0; } sscanf(argv[2], "%d:%d:%d", &llx, &lly, &msz); xs = (double)llx / 1000.; ys = (double)lly / 1000.; dm = (double)msz / 1000.; sscanf(argv[3], "%d:%d:%d:%d:%d", &ift, &igr, &llu, &p1, &p2); if ((igr<1) || (igr>2)) { printf("mktpng: Illegal geod. specifier\n"); exit(1); } if (((igr==1) && (nc<200)) || ((igr==2) && (nc>=200))) igr += 2; switch (ift) { case 1: llu = 2; p1 = 5; p2 = 6; break; case 2: llu = 1; p1 = 2; p2 = 3; break; case 3: llu = 1; p1 = 3; p2 = 4; break; case 4: llu = 1; p1 = 1; p2 = 2; break; case 0: if ((llu<1) || (llu>2)) { printf("mktpng: Illegal specifier (llu)\n"); exit(1); } if ((p1<1) || (p1>30)) { printf("mktpng: Illegal specifier (p1)\n"); exit(1); } if ((p2<1) || (p2>30) || (p1==p2)) { printf("mktpng: Illegal specifier (p2)\n"); exit(1); } break; default: printf("mktpng: Unknown file type\n"); exit(1); } fmt[p1*3-2] = 'l'; fmt[p1*3-1] = 'f'; fmt[p2*3-2] = 'l'; fmt[p2*3-1] = 'f'; if (p1 < p2) { fmt[p2*3] = '\0'; } else { fmt[p1*3] = '\0'; } if ((fin=fopen(argv[4],"r")) == NULL) { printf("mktpng: input-file open fail\n"); exit(1); } cvinit(nc, (double)iorg, (double)korg, 0., 0.); while (fgets(buf,151,fin) != NULL) { if ((buf[0]=='#') || (buf[0]=='&') || (buf[0]=='%')) continue; if (ift == 4) { sscanf(buf, "%lfN %lfE %lfm %lfnT", &dlat,&dlon,&d1,&d2); } else { sscanf(buf,fmt,&d1,&d2); if (p1 < p2) { dlat = d1; dlon = d2; } else { dlat = d2; dlon = d1; } if (llu == 2) { dlat *= 60.; dlon *= 60.; } } if (igr == 3) { xw84t(dlat, dlon, 0., &vlat, &vlon, &valt); cviken(vlat, vlon, &ye, &xn); } else if (igr == 4) { xtw84(dlat, dlon, 0., &vlat, &vlon, &valt); cviken(vlat, vlon, &ye, &xn); } else { cviken(dlat, dlon, &ye, &xn); } i = (int)((xn-xs)/dm + 1); j = (int)((ye-ys)/dm + 1); k = (i+20)*651 + (j+20); pb = bm + k; if (*pb < 128) (*pb)++; } fclose(fin); pb = bm; for (ii=-20; ii<0; ii++) for (jj=-20; jj<631; jj++) *pb++ = 0xc0; for (ii=0; ii<401; ii++) { for (jj=-20; jj<0; jj++) *pb++ = 0xc0; for (jj=0; jj<401; jj++) { i = *pb; if (i == 0) j = 0xff; else { if (i < 16) { if (i < 4) { if (i < 2) j = 0xdd; else j = 0xbb; } else { if (i < 8) j = 0x99; else j = 0x77; } } else { if (i < 64) { if (i < 32) j = 0x55; else j = 0x33; } else { if (i <128) j = 0x11; else j = 0x00; } } } *pb++ = j; } for (jj=401; jj<631; jj++) *pb++ = 0xc0; } for (ii=401; ii<421; ii++) for (jj=-20; jj<631; jj++) *pb++ = 0xc0; if ((fin=fopen("setgp.par", "r")) == NULL) { printf("mktpng: aux-file open fail\n"); exit(1); } while (1) { if (fgets(buf,81,fin) == NULL) { fclose(fin); printf("mkmpng: aux-file error1\n"); exit(1); } sscanf(buf, " %d %d", &ixs,&iys); if ((ixs == 0) && (iys == 0)) break; for (n=0; n<10; n++,iys++) { fgets(buf,81,fin); ls = strlen(buf); for (i=0; i(iys-2-i-i); j--) { pb = bm + (i + ixs + (441-j)*651); *pb++ = 0x00; } for (i=5; i<10; i++) for (j=iys; j>(iys-20+i+i); j--) { pb = bm + (i + ixs + (441-j)*651); *pb++ = 0x00;} } else if (n == 1) { for (j=0; j<5; j++) for (i=ixs; i<(ixs+2+j+j); i++) { pb = bm + (i + (441-j-iys)*651); *pb++ = 0x00; } for (j=5; j<10; j++) for (i=ixs; i<(ixs+20-j-j); i++) { pb = bm + (i + (441-j-iys)*651); *pb++ = 0x00; } } else if (n == 2) { for (i=0; i<5; i++) for (j=iys; j<(iys+2+i+i); j++) { pb = bm + (i + ixs + (441-j)*651); *pb++ = 0x00; } for (i=5; i<10; i++) for (j=iys; j<(iys+20-i-i); j++) { pb = bm + (i + ixs + (441-j)*651); *pb++ = 0x00; } } else if (n == 3) { for (j=0; j<5; j++) for (i=ixs; i>(ixs-2-j-j); i--) { pb = bm + (i + (441-j-iys)*651); *pb++ = 0x00; } for (j=5; j<10; j++) for (i=ixs; i>(ixs-20+j+j); i--) { pb = bm + (i + (441-j-iys)*651); *pb++ = 0x00; } } } while (1) { if (fgets(buf,81,fin) == NULL) { fclose(fin); printf("mktpng: aux-file error3\n"); exit(1); } sscanf(buf, " %d %d %d %d", &ixs,&iys,&ii,&jj); if ((ixs == 0) && (iys == 0)) break; for (j=0; j 5) { if ((fout=fopen(argv[5],"wb")) == NULL) { printf("mktpng: output-file open fail\n"); exit(1); } } else { fout = stdout; } png_init_io(png_ptr, fout); png_set_IHDR(png_ptr, info_ptr, 651, 441, 8, PNG_COLOR_TYPE_GRAY, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); png_set_sBIT(png_ptr, info_ptr, &sig_bit); png_write_info(png_ptr, info_ptr); png_write_image(png_ptr, row_pointers); png_write_end(png_ptr, info_ptr); png_destroy_write_struct(&png_ptr, &info_ptr); if (argc > 5) { fclose(fout); } free(bm); exit(0); }