Esempio n. 1
0
int
mbbs_wrpng(Ping *png, MemType *data, XDR *xdrs)
/*
   User-callable routine.
   Writes ping header and data to the
   XDR stream pointed to by xdrs.
   Returns BS_SUCCESS, BS_BADARCH or BS_WRITE.
*/
{
	unsigned long ibcsv;

	if (sizeof(int) < 4)
		return BS_BADARCH;

	bs_iobytecnt= 0;

	if (mbbs_wrpnghdr(png, xdrs) != BS_SUCCESS)
		return BS_WRITE;

	ibcsv= bs_iobytecnt;
	if (mbbs_wrpngdata(png, data, xdrs) != BS_SUCCESS)
		return BS_WRITE;
	bs_iobytecnt+= ibcsv;

	return BS_SUCCESS;
}
Esempio n. 2
0
int
mbbs_setswradius(int version, FILE *fp, long phoffset, int side, unsigned int dtmask, float swradius)
/*
   Flags all samples of the specified datatype on the named side at
   across-track distances greater than swradius with {BTYD,SSD}_SWEDGE for
   the ping whose header is located at an arbitrary file byte offset.
*/
{
	Ping png;
	PingData pngdata;
	XDR xdr;
	int err, i, trimbty, trimss;
	int bsi, nbtyvals, nssvals, ssstart;
	long pdoffset;
	float *bty;
	float sscutoff;
	unsigned int *btyflags;
	unsigned char *ssflags;
	unsigned long datasz;

	switch (version) {
	case MR1_VERSION_1_0:
	case MR1_VERSION_2_0:
		return BS_BADDATA;
	case BS_VERSION_1_0:
	case BS_VERSION_1_1:
	case BS_VERSION_1_2:
	case BS_VERSION_1_3:
	case BS_VERSION_1_4:
		break;
	default:
		return BS_BADDATA;
	}

	if (fp == (FILE *) 0)
		return BS_BADARG;

	switch (side) {
	case ACP_PORT:
	case ACP_STBD:
		break;
	default:
		return BS_BADARG;
	}

	if (!(dtmask & BS_DTM_BATHYMETRY) &&
	    !(dtmask & BS_DTM_SIDESCAN))
		return BS_BADARG;

	if (swradius < 0.)
		return BS_BADARG;

	if (fseek(fp, phoffset, SEEK_SET) != 0)
		return BS_FSEEK;
	xdrstdio_create(&xdr, fp, XDR_DECODE);

	if (!mbbs_xdrpnghdr(&png, &xdr, version)) {
		xdr_destroy(&xdr);
		return BS_READ;
	}
	trimbty= trimss= 0;
	if (dtmask & BS_DTM_BATHYMETRY) {
		if ((nbtyvals= png.png_sides[side].ps_btycount) > 0)
			trimbty= 1;
	}
	if (dtmask & BS_DTM_SIDESCAN) {
		if ((sscutoff= swradius-png.png_sides[side].ps_ssxoffset) < 0.)
			sscutoff= 0.;
		ssstart= sscutoff/png.png_ssincr;
		if ((nssvals= png.png_sides[side].ps_sscount) > ssstart)
			trimss= 1;
	}
	if (!trimbty && !trimss) {
		xdr_destroy(&xdr);
		return BS_SUCCESS;
	}

	/* remember current file offset at end of ping header */
	pdoffset= phoffset+bs_iobytecnt;

	if ((err= mbbs_pngrealloc(&png, &bswsf_databuf, &bswsf_databufsz)) != BS_SUCCESS) {
		xdr_destroy(&xdr);
		return err;
	}
	if ((err= mbbs_rdpngdata(&png, bswsf_databuf, &xdr)) != BS_SUCCESS) {
		xdr_destroy(&xdr);
		return err;
	}
	datasz= bs_iobytecnt;
	xdr_destroy(&xdr);

	if ((err= mbbs_getpngdataptrs(&png, bswsf_databuf, &pngdata)) != BS_SUCCESS)
		return err;

	/* set {BTYD,SSD}_SWEDGE on all desired samples */
	if (dtmask & BS_DTM_BATHYMETRY) {
		if (png.png_flags & PNG_XYZ)
			bsi= 3;
		else
			bsi= 2;
		if ((bty= pngdata.pd_bty[side]) == (float *) 0)
			return BS_BADDATA;
		if ((btyflags= pngdata.pd_btyflags[side]) == (unsigned int *) 0)
			return BS_BADDATA;
		for (i= 0; i < nbtyvals; i++) {
			if (bty[bsi*i] > swradius)
				btyflags[i]|= BTYD_SWEDGE;
		}
	}
	if (dtmask & BS_DTM_SIDESCAN) {
		if ((ssflags= pngdata.pd_ssflags[side]) == (unsigned char *) 0)
			return BS_BADDATA;
		for (i= ssstart; i < nssvals; i++)
			ssflags[i]|= SSD_SWEDGE;
	}

	/* seek to beginning of ping data region and rewrite it */
	if (fseek(fp, pdoffset, SEEK_SET) != 0)
		return BS_FSEEK;
	xdrstdio_create(&xdr, fp, XDR_ENCODE);
	if ((err= mbbs_wrpngdata(&png, bswsf_databuf, &xdr)) != BS_SUCCESS) {
		xdr_destroy(&xdr);
		return err;
	}

	bs_iobytecnt= datasz;
	xdr_destroy(&xdr);
	(void) fflush(fp);

	return BS_SUCCESS;
}