⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 render.c

📁 seismic software,very useful
💻 C
📖 第 1 页 / 共 2 页
字号:
/*render object codedraws raster images into various buffersdraws axis and cross-line annotationscontains optimized subroutines for rapid raster rendering*/#include <stdio.h>#include "main.h"#include "axis.h"#include "data.h"#include "map.h"#include "render.h"#include "plane.h"#include "view.h"#include "pick.h"#include "rargs.h"/* C or FORTRAN renderers */#ifndef FORTRAN#define RENDER_BASIC_HORZ	RenderBasicHorz CALLARGS#define RENDER_BASIC_VERT	RenderBasicVert CALLARGS#define RENDER_SHADOW_HORZ	RenderShadowHorz CALLARGS#define RENDER_SHADOW_VERT	RenderShadowVert CALLARGS#define RENDER_INTERP_HORZ	RenderInterpHorz CALLARGS#define RENDER_INTERP_VERT	RenderInterpVert CALLARGS#define RENDER_TRANSP_HORZ	RenderTranspHorz CALLARGS#define RENDER_TRANSP_VERT	RenderTranspVert CALLARGS#endif#ifdef FORTRAN#define RENDER_BASIC_HORZ	renderbasichorz_ FCALLARGS#define RENDER_BASIC_VERT	renderbasicvert_ FCALLARGS#define RENDER_SHADOW_HORZ	rendershadowhorz_ FCALLARGS#define RENDER_SHADOW_VERT	rendershadowvert_ FCALLARGS#define RENDER_INTERP_HORZ	renderinterphorz_ FCALLARGS#define RENDER_INTERP_VERT	renderinterpvert_ FCALLARGS#define RENDER_TRANSP_HORZ	rendertransphorz_ FCALLARGS#define RENDER_TRANSP_VERT	rendertranspvert_ FCALLARGS#endif#define CORD3	AxisDir(MapAxis(zmap)),MapFrame(zmap),\		AxisDir(MapAxis(map4)),MapFrame(map4),\		AxisDir(MapAxis(map5)),MapFrame(map5)#define CORD3P	AxisDir(MapAxis(zmap)),MapPrev(zmap),\		AxisDir(MapAxis(map4)),MapFrame(map4),\		AxisDir(MapAxis(map5)),MapFrame(map5)/* initialize render object */RenderRenderInit ()	{	Render render;	NEW(Render,render,1);	render->wide = 0;	render->hite = 0;	render->interp = 0;	render->polarity = RENDER_POLARITY;	render->fence_transp = RENDER_FENCE_TRANSP;	render->low_transp = RENDER_LOW_TRANSP;	render->high_transp = RENDER_HIGH_TRANSP;	render->vol_transp = RENDER_VOL_TRANSP;	GETPARINT ("interpolate","d",&render->interp);	GETPARINT ("fence_transp","d",&render->fence_transp);	GETPARINT ("vol_transp","d",&render->vol_transp);	render->image = 0;	render->shadow = 0;	render->zbuffer = 0;	return (render);	}/* adjust render size: reallocate buffers, adjust map axes */RenderSize (wide,hite)int wide, hite;	{	extern Render render;	if (!render) return;	/* reallocate buffers */	if (wide != render->wide || hite != render->hite) {		render->wide = wide;		render->hite = hite;		FREE(render->image);		NEW(Buffer,render->image,render->wide*render->hite);		FREE(render->zbuffer);		NEW(Zbuffer,render->zbuffer,render->wide*render->hite);		FREE (render->shadow);		NEW(Shadow,render->shadow,render->wide*render->hite);		}	RenderClear ();	}/* extract plane in horizontal scan mode; given data, render buffers, three   map attr->axes, origin, options to attr->image attr->skew, data, attr->axes, attr->shadow, and line */RenderHorz (data,hmap,vmap,zmap,map4,map5,h0,v0,render,margins,attr)Data data;Map hmap, vmap, zmap, map4, map5;Render render;RenderAttr attr;int h0, v0, margins[];	{	int x, y, transp;	float tic;	string label;	if (!data || !render || !hmap || !hmap->map) return;	attr->shadow = 1;	/* clear previous pick */	if (attr->pick && attr->mark==0) {		PickDraw (PickFind(CORD3P),ERASE);		}	/* record plane */	attr->orient = RENDER_HORZ;	if (attr->image) {		render->h0 = h0;		render->v0 = v0;		render->nh = MapSize (hmap) + attr->skew * (MapSize (vmap) + GAP) + attr->transp * MapSize(zmap);		render->nh = render->wide - render->h0 < render->nh ? render->wide - render->h0 : render->nh;		render->nv = MapSize (vmap) + attr->transp * MapSize(zmap);		render->nv = render->hite - render->v0 < render->nv ? render->wide - render->v0 : render->nv;		}	if (attr->mark) PlaneSet (hmap,vmap,zmap,map4,map5,render->h0,render->v0,render->nh,render->nv,render,margins,attr);	else {		PlaneSetFrame (PlaneFind(CORD3P),MapFrame(zmap));		}	/* extract images */	if (attr->image) {		/* update window */		if (attr->zbuffer) {			if (!strcmp(MapName(zmap),"DEEP")) {				if (render->interp) RenderFrontFenceInterpHorz CALLARGS;				else RenderFrontFenceHorz CALLARGS;				}			if (!strcmp(MapName(zmap),"DOWN")) {				if (render->interp) RenderTopFenceInterpHorz CALLARGS;				else RenderTopFenceHorz CALLARGS;				}			}		else if (attr->transp) {			transp = render->fence_transp * DataValueSize (data) * .01;			RENDER_TRANSP_HORZ;			}		else if (render->interp) RENDER_INTERP_HORZ;		else RENDER_BASIC_HORZ;		if (attr->shadow && !attr->zbuffer) RENDER_SHADOW_HORZ;		}	/* draw crosslines */	if (attr->lines) {		/* erase horizontal */		x = h0 + attr->skew * (MapSize(vmap) -			MapInverse(vmap,MapPrev(vmap)));		y = v0 + MapInverse(vmap,MapPrev(vmap));		DrawLine (x,y,x+MapSize(hmap),y,ERASE);		/* erase vertical */		x = h0 + MapInverse(hmap,MapPrev(hmap));		DrawLine (x+attr->skew*MapSize(vmap),v0,x,v0+MapSize(vmap),ERASE);		/* draw horizontal */		x = h0 + attr->skew * (MapSize(vmap) -			MapInverse(vmap,MapFrame(vmap)));		y = v0 + MapInverse(vmap,MapFrame(vmap));		DrawLine (x,y,x+MapSize(hmap),y,DRAW);		/* draw vertical */		x = h0 + MapInverse(hmap,MapFrame(hmap));		DrawLine (x+attr->skew*MapSize(vmap),v0,x,v0+MapSize(vmap),DRAW);		}	/* draw box */	if (attr->box) {		DrawLine (h0-1+attr->skew*MapSize(vmap),v0-1,			h0+MapSize(hmap)+attr->skew*MapSize(vmap),v0-1,DRAW);		DrawLine (h0-1,v0+MapSize(vmap),h0+MapSize(hmap),			v0+MapSize(vmap),DRAW);		DrawLine (h0-1+attr->skew*(MapSize(vmap)+1),v0-1,h0-1,			v0+MapSize(vmap),DRAW);		DrawLine (h0+MapSize(hmap)+attr->skew*(MapSize(vmap)+1),v0-1,			h0+MapSize(hmap),v0+MapSize(vmap),DRAW);		}	/* draw pick */	if (attr->pick) {		PickDraw (PickFind(CORD3),DRAW);		}	/* left tics */	if (attr->axes&AXIS_LEFT) {		for (tic=MapTic0(vmap); tic<=MapTic2(vmap)+.5*MapDtic(vmap);			tic+=MapDtic(vmap)) {			y = v0 + MapIndex (vmap,tic);			x = h0 + attr->skew * (MapSize(vmap) - MapIndex(vmap,tic));			sprintf (label,MapFormat(vmap),tic);			DrawText (x-TIC_LENGTH-1,y-5,TEXT_V0|TEXT_H100,label);			DrawLine (x-TIC_LENGTH,y,x,y,DRAW);			}		/* label */		if (MapNtic(vmap) == 1) {/*                	x = h0 - margins[MARGIN_LEFT] + attr->skew * MapSize(vmap) / 2;*/			x = h0 - 5 + attr->skew * MapSize(vmap) / 2;			y = v0 + MapSize(vmap) / 2;			}		else	{			tic = (MapTic0(vmap) + MapTic2(vmap) +				 (MapNtic(vmap)%2)*MapDtic(vmap)) / 2;			y = v0 + MapIndex (vmap,tic);/*			x = h0 + attr->skew * (MapSize(vmap) -				MapIndex(vmap,tic)) - margins[MARGIN_LEFT];*/			x = h0 - 5 + attr->skew * (MapSize(vmap) - MapIndex(vmap,tic));			}		DrawText (x,y,TEXT_V50|TEXT_H100,AxisLabel(MapAxis(vmap)));		/* border line */		DrawLine (h0-1+attr->skew*MapSize(vmap),v0,h0-1,v0+MapSize(vmap),DRAW);		}	/* base tics */	if (attr->axes&AXIS_BASE) {		for (tic=MapTic0(hmap); tic<MapTic2(hmap)+.5*MapDtic(hmap); 			tic+=MapDtic(hmap)) {			x = h0 + MapIndex (hmap,tic);			y = v0 + MapSize(vmap);			sprintf (label,MapFormat(hmap),tic);			DrawText (x-10,y+TIC_LENGTH,TEXT_V0|TEXT_H0,label);			DrawLine (x,y,x,y+TIC_LENGTH,DRAW);			}		/* label */		if (MapNtic(hmap) == 1) {			x = h0 + MapSize(hmap)/2;			y = v0 + margins[MARGIN_BASE] + MapSize(vmap);			}		else	{			tic = (MapTic0(hmap) + MapTic2(hmap) +				(MapNtic(hmap)%2)*MapDtic(hmap)) / 2;			x = h0 + MapIndex (hmap,tic);			y = v0 + MapSize(vmap) + margins[MARGIN_BASE];			}		DrawText (x,y,TEXT_V100|TEXT_H50,AxisLabel(MapAxis(hmap)));		/* border line */		DrawLine (h0,v0+MapSize(vmap),h0+MapSize(hmap),			v0+MapSize(vmap),DRAW);		}	}/* extract panel in vertical scan line mode; permits vertical attr->skewing for sideof cubes */RenderVert (data,hmap,vmap,zmap,map4,map5,h0,v0,render,margins,attr)Data data;Map hmap, vmap, zmap, map4, map5;Render render;RenderAttr attr;int h0, v0, margins[];	{	int x, y, transp;	float tic;	string label;	if (!data || !render || !hmap || !hmap->map) return;	attr->shadow = 1;	/* clear picks */	if (attr->pick && attr->mark==0) {		PickDraw (PickFind(CORD3P),ERASE);		}	/* record plane */	attr->orient = RENDER_VERT;	if (attr->image) {		render->h0 = h0;		render->v0 = v0 - attr->skew * (MapSize (hmap) + GAP);		render->nh = MapSize (hmap) + attr->transp * MapSize(zmap);		render->nv = MapSize (vmap) + attr->skew * (MapSize (hmap) + GAP) + attr->transp * MapSize(zmap);		render->nh = render->wide - render->h0 < render->nh ? render->wide - render->h0 : render->nh;		render->nv = render->hite - render->v0 < render->nv ? render->wide - render->v0 : render->nv;		}	if (attr->mark) PlaneSet (hmap,vmap,zmap,map4,map5,render->h0,render->v0,render->nh,render->nv,render,margins,attr);	else {		PlaneSetFrame (PlaneFind(CORD3P),MapFrame(zmap));		}	/* extract image */	if (attr->image) {		/* update window */		if (attr->zbuffer) {			if (!strcmp(MapName(zmap),"ACROSS")) {				if (render->interp) RenderSideFenceInterpVert CALLARGS;				else RenderSideFenceVert CALLARGS;				}			}		else if (attr->transp) {			transp = render->fence_transp * DataValueSize (data) * .01;			RENDER_TRANSP_VERT;			}		else if (render->interp) RENDER_INTERP_VERT;		else RENDER_BASIC_VERT;		if (attr->shadow && !attr->zbuffer) RENDER_SHADOW_VERT;		}	/* draw cross lines */	if (attr->lines) {		/* erase horizontal line */		y = v0 + MapInverse(vmap,MapPrev(vmap));		DrawLine (h0,y,h0+MapSize(hmap),y-attr->skew*MapSize(hmap),ERASE);		/* erase vertical line */		x = h0 + MapSize(hmap) - MapInverse(hmap,MapPrev(hmap));		y = v0 - attr->skew * (x - h0);		DrawLine (x,y,x,y+MapSize(vmap),ERASE);		/* draw horizontal line */		y = v0 + MapInverse(vmap,MapFrame(vmap));		DrawLine (h0,y,h0+MapSize(hmap),y-attr->skew*MapSize(hmap),DRAW);		/* draw vertical line */		x = h0 + MapSize(hmap) - MapInverse(hmap,MapFrame(hmap));		y = v0 - attr->skew * (x - h0);		DrawLine (x,y,x,y+MapSize(vmap),DRAW);		}	/* draw box */	if (attr->box) {		DrawLine (h0-1,v0-1,h0+MapSize(hmap),			v0-1-attr->skew*(MapSize(hmap)+1),DRAW);		DrawLine (h0-1,v0+MapSize(vmap)+1,h0+MapSize(hmap),			v0+MapSize(vmap)+1-attr->skew*(MapSize(hmap)+1),DRAW);		DrawLine (h0-1,v0,h0-1,v0+MapSize(vmap),DRAW);		DrawLine (h0+MapSize(hmap),v0+1-attr->skew*MapSize(hmap),		h0+MapSize(hmap),v0+1+MapSize(vmap)-attr->skew*MapSize(hmap),DRAW);		}	/* draw picks */	if (attr->pick) {		PickDraw (PickFind(CORD3),DRAW);		}	/* left tics */	if (attr->axes&AXIS_LEFT) {		for (tic=MapTic0(vmap); tic<=MapTic2(vmap)+.5*MapDtic(vmap);			tic+=MapDtic(vmap)) {			y = v0 + MapIndex (vmap,tic);			x = h0;			sprintf (label,MapFormat(hmap),tic);			DrawText (x-TIC_LENGTH,y-5,TEXT_V0|TEXT_H100,label);                        DrawLine (x-TIC_LENGTH,y,x,y,DRAW);			}		/* label */		if (MapNtic(vmap) == 1) {                	x = h0 - margins[MARGIN_LEFT];			y = v0 + MapSize(vmap) / 2;			}		else	{			tic = (MapTic0(vmap) + MapTic2(vmap) +				(MapNtic(vmap)%2)*MapDtic(vmap)) / 2;			y = v0 + MapIndex (vmap,tic);			x = h0 + - margins[MARGIN_LEFT];			}		DrawText (x,y,TEXT_V50|TEXT_H0,AxisLabel(MapAxis(vmap)));		/* border line */		DrawLine (h0-1,v0,h0-1,v0+MapSize(vmap),DRAW);		}	/* base tics */	if (attr->axes&AXIS_BASE) {		for (tic=MapTic0(hmap); tic<=MapTic2(hmap)+.5*MapDtic(hmap);			tic+=MapDtic(hmap)) {			x = h0 + MapSize(hmap) - MapIndex (hmap,tic);			y = v0 + MapSize(vmap) - attr->skew * (MapSize(hmap) -				MapIndex(hmap,tic));			sprintf (label,MapFormat(hmap),tic);			if (attr->skew) {				DrawText (x+TIC_LENGTH+1,y,TEXT_V50|TEXT_H0,label);				DrawLine (x,y,x+TIC_LENGTH,y,DRAW);				}			else	{				DrawText (x-10,y+TIC_LENGTH,TEXT_V0|TEXT_H0,label);				DrawLine (x,y,x,y+TIC_LENGTH,DRAW);				}			}		/* label */		if (MapNtic(hmap) == 1) {			x = h0 + MapSize(hmap)/2;			y = v0 + (attr->skew>0?0:1) * margins[MARGIN_BASE] +				MapSize(vmap) - attr->skew * MapSize(hmap)/2;			}		else	{			tic = (MapTic0(hmap) + MapTic2(hmap) +				(MapNtic(hmap)%2)*MapDtic(hmap)) / 2;			x = h0 + MapSize(hmap) - MapIndex (hmap,tic);			y = v0 + MapSize(vmap) + (attr->skew>0?0:1) *				margins[MARGIN_BASE] - attr->skew * (MapSize(hmap) -				MapIndex(hmap,tic));			}		if (attr->skew) DrawText (x,y+TIC_LENGTH,TEXT_V0|TEXT_H0,			AxisLabel(MapAxis(hmap)));		else DrawText (x,y,TEXT_V100|TEXT_H50,AxisLabel(MapAxis(hmap)));		/* border line */		DrawLine (h0,v0+MapSize(vmap),h0+MapSize(hmap),			v0+MapSize(vmap)-attr->skew*MapSize(hmap),DRAW);		}	}/* extract plane along pick line */RenderDeep (data,hmap,vmap,zmap,map4,map5,h0,v0,render,margins,attr)Data data;Map hmap, vmap, zmap, map4, map5;Render render;RenderAttr attr;int h0, v0, margins[];	{	Map_ hmap1, vmap1, zmap1;	extern PickLine lastpick;	int ipick, idim, rmap;	float arclen, darc, dlen, dseg, seglen[NPICK], interp;	extern double sqrt();	if (!lastpick || PickCount(lastpick) < 2) return;  /* no active pick */	/* compute new map maps based on supplied maps */	/* hmap is zmap resized into zmap */	/* vmap is replaced by pick map */	/* zmap is inactive */	hmap1 = *zmap;	vmap1 = *vmap;	zmap1 = *zmap;	FREE (vmap1.map);	NEW (Vec,vmap1.map,MapSize(&vmap1));	hmap1.map = 0;	MapSetSize (&hmap1,MapSize(&zmap1));	zmap1.frame = 0;	/* compute pick segment length in samples */	for (ipick=1; ipick<PickCount(lastpick)-1; ipick++) {		for (seglen[ipick]=0, idim=0; idim<3; idim++) {			seglen[ipick] += (PickIndex(lastpick,ipick,idim) - 				PickIndex(lastpick,ipick+1,idim)) *				(PickIndex(lastpick,ipick,idim)-				PickIndex(lastpick,ipick-1,idim));			}		seglen[ipick] = sqrt (seglen[ipick]);		arclen += seglen[ipick];		}	/* compute interpolation axis */	dlen = arclen / MapSize(&vmap1);	for (darc=0, dseg=0, rmap=0, ipick=0; rmap<MapSize(&vmap1);		rmap++, dseg+=dlen){		/* check to see if in new segment of arc */		if (dseg >= darc) {			darc += seglen[ipick];			ipick++;			}		/* interption along current arc segment */		interp = (darc - dseg) / seglen[ipick-1];		vmap1.map[rmap] = 0;		/* add up interptional data offsets of two pick dimensions */		for (idim=1; idim<4; idim++) {			/* skip perpendicular dimension */			if (idim != PickDir(lastpick)) {				vmap1.map[rmap] += (int)(interp *					 PickIndex(lastpick,ipick,idim) +					(1.-interp) * PickIndex(lastpick,ipick-1,idim)) * 					AxisStride(DataAxis(data,idim));				}			}		}	/* plot it */	attr->orient = RENDER_DEEP;	RenderHorz (data,&hmap1,&vmap1,&zmap1,h0,v0,render,margins,attr);/*	(attr)	0,0,1,AXIS_BASE,1,1,1,0,margins*/	}/* return buffer value */RenderBufferValue (render,x,y)Render render;int x, y;	{	if (!render) return (0);	return (render->image[render->wide*y+x]);	}/* return shadow value */RenderShadowValue (render,x,y)Render render;int x, y;	{	if (!render) return (NO_INDEX);	if (x < 0 || x >= render->wide || y < 0 || y >= render->hite) return (NO_INDEX);	return (render->shadow[render->wide*y+x]);	}/* return buffer */BufferRenderBuffer (render)Render render;	{	if (!render) return (0);	return (render->image);	}/* draw render */RenderDraw ()	{	extern Render render;	if (!render || UIFirst()) return;	DrawMask (254);	if (MovieRun()) {		DrawImage (render,render->h0,render->v0,render->nh,render->nv);		}	else	{		DrawImage (render,0,0,render->wide,render->hite);		}	}/* print render information */RenderInfo (render)Render render;	{	Message message;	if (!render) return;	sprintf (message,"Render: wide=%d hite=%d interpolate=%d fence_transp=%d low_transp=%d high_transp=%d vol_transp=%d",		render->wide,		render->hite,		render->interp,		render->fence_transp,		render->low_transp,		render->high_transp,		render->vol_transp);	UIMessage (message);	}/* save render parameters */RenderSavePar ()	{	Message message;	extern Render render;	if (!render) return;	sprintf (message,"Render: wide=%d hite=%d interpolate=%d fence_transp=%d low_transp=%d high_transp=%d vol_transp=%d",		render->wide,		render->hite,		render->interp,

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -