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

📄 picktest.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
字号:
#ifndef lintstatic  char sccsid[] = "@(#)picktest.c 1.1 92/07/30 Copyr 1990 Sun Micro";#endif/* * Copyright (c) 1990 by Sun Microsystems, Inc. */#include <stdio.h>#include <pixrect/pixrect_hs.h>#include <pixrect/gp1cmds.h>#define MAX_PICK	100typedef struct {     short pick_hit;     unsigned int pick_count;     int pick_id_0;     int pick_id_1;} Pick_info;typedef enum {     draw,     move,     lastdraw = 0x8000,     lastmove = 0x8001} Draw;typedef enum {parallel, perspective, done} Projection;typedef enum {red, white, green, black} Color;typedef struct {/*how to pass window borders around*/     union {	  float f;	  int i;     } xmin, ymin, zmin, xmax, ymax, zmax;} Window;extern short *allocbuf();double scale;int color;int hits;int misses;int poly;int two_d;int alloc_err;enum {in, out, left, center, right};static char *types[] = {"in", "outside", "left of", "center of", "right of"};typedef enum {triangle, polygon} Mode;static char *modes[] = {"Triangle", "Polygon"};extern char *errmsg_list[];static char errtext[512];/**********************************************************************/char *picktest()/**********************************************************************/{    int k, type;    int mode;    int err;    float x, y;    Pick_info *checkpick(), *pickptr;    Window pickrect;    err = alloc_err = 0;    pickrect.ymin.i = 200;    pickrect.ymax.i = 800;    scale = 1.0;    two_d = 0;    pickrect.zmin.i = 0;    pickrect.zmax.i = 0;    for (mode = (int)triangle ; mode <= (int)polygon ; mode++) {	poly  = mode;	for (type = (int)in; type <= (int)right; type++) {	    hits   = 0;	    misses = 0;	    k      = 0;	    switch (type) {		case in:		    pickrect.xmin.i = 550;		    pickrect.xmax.i = 650;		break;		case out:		    pickrect.xmin.i = 550;		    pickrect.xmax.i = 555;		break;		case left:		    pickrect.xmin.i = 565;		    pickrect.xmax.i = 570;		break;		case center:		    pickrect.xmin.i = 575;		    pickrect.xmax.i = 580;		break;		case right:		    pickrect.xmin.i = 580;		    pickrect.xmax.i = 585;		break;	    }	    (void)fast_clear();	    if (alloc_err) {		error_report(errmsg_list[52]);		return (char *)0;	    }	    (void)picksquare (&pickrect);	    color = 1;	    while (k < MAX_PICK) {		(void)setpick(&pickrect);	        if (alloc_err) {		   error_report(errmsg_list[52]);		   return (char *)0;	        }		(void)clearpick();	        if (alloc_err) {		   error_report(errmsg_list[52]);		   return (char *)0;	        }		x = 0.;		y = 0.;		(void)marker((Color)color, x, y, 0.0);	        if (alloc_err) {		   error_report(errmsg_list[52]);		   return (char *)0;	        }/*		(void)marker((Color)color, x, y, ((double)k/(double)MAX_PICK));*/		pickptr = checkpick ();	        if (alloc_err) {		   error_report(errmsg_list[52]);		   return (char *)0;	        }		color = (color == 3) ? 0 : color+1;		if (pickptr->pick_hit) {		    if (type == out) {			misses++;		    } else {			hits++;		    }		} else {		    if (type == out) {			hits++;		    } else {			misses++;		    }		}		k++;	    }	    if (misses) {		err++;		sprintf (errtext, "%s pick test: detected %d miss(es) %s the pick window out of total %d picking events.\n", modes[poly], misses, types[type], MAX_PICK);		(void)error_report(errtext);	    }	}    }    if (err) {	return ("Suspect problem with interrupt.\n");    } else {	return (char *)0;    }}/**********************************************************************/setpick(border)/**********************************************************************/Window *border;{     short *ptr;     int pickid;     ptr = allocbuf();     if (ptr == (short *)-1) {	alloc_err = -1;	return(0);     }     *ptr++ = GP1_SET_PICK | GP1_PICK_DRAW;     pickid = 5;     *ptr++ = GP1_SET_PICK_ID | 0; /*set value of pick-id 0*/     GP1_PUT_I(ptr,pickid);     pickid = 6;     *ptr++ = GP1_SET_PICK_ID | 1; /*set value of pick-id 1*/     GP1_PUT_I(ptr,pickid);     *ptr++ = GP1_SET_PICK_WINDOW; /*set dimensions of pick window*/     *ptr++ = border->xmin.i;      *ptr++ = border->ymin.i;     *ptr++ = border->xmax.i - border->xmin.i;     *ptr++ = border->ymax.i - border->ymin.i;     (void)postbuf(ptr);}/**********************************************************************/picksquare(border)/**********************************************************************/Window *border;{    box(border->xmin.i, border->ymin.i, border->xmax.i, border->ymax.i);}/**********************************************************************/clearpick()/**********************************************************************/{     short *ptr;     ptr = allocbuf();     if (ptr == (short *)-1) {	alloc_err = -1;	return(0);     }     if (*ptr == -1) return(-1);     *ptr++ = GP1_CLEAR_PICK; /*clear everything*/     (void)postbuf(ptr);     return(0);}/**********************************************************************/Pick_info *checkpick()/**********************************************************************/{     short *ptr;     short *ptrsave;     short *result;     static Pick_info info;     ptr = allocbuf();     if (ptr == (short *)-1) {	alloc_err = -1;	return(0);     }     ptrsave = ptr;     *ptr++ = GP1_GET_PICK | 1; /*get one pick*/     result = ptr; /*save return location*/     *ptr++ = 1; /*not ready*/      ptr += 7; /*save room for pick event*/     postbuf_n_wait(ptr, result);     info.pick_hit = *(++result); /*load info data structure*/     result++;     GP1_GET_I(result,info.pick_count);     GP1_GET_I(result,info.pick_id_0);     GP1_GET_I(result,info.pick_id_1);     ptr = ptrsave;     *ptr++ = GP1_CLEAR_PICK; /*clear everything*/     (void)postbuf(ptr);     return(&info);}/**********************************************************************/marker(color,xp,yp,zp)/**********************************************************************/Color color;float xp,yp,zp;{    float r,g,b;    float x,y,z;    float tempf;    short *ptr;    x = xp;    y = yp;    z = zp;    ptr = allocbuf();    if (ptr == (short *)-1) {	alloc_err = -1;	return(0);    }    switch ((int)color) {	case black:	    r = 0.0;	    g = 0.0;	    b = 0.0;	    break;	case red:	    r = 1.0;	    g = 0.0;	    b = 0.0;	    break;	case green:	    r = 0.0;	    g = 1.0;	    b = 0.0;	    break;	case white:	    r = 1.0;	    g = 1.0;	    b = 1.0;	    break;    }    *ptr++ = GP2_SET_RGB_COLOR | GP2_RGB_COLOR_TRIPLE; /*set marker color*/    GP1_PUT_F(ptr,r);    GP1_PUT_F(ptr,g);    GP1_PUT_F(ptr,b);    if (two_d) {	*ptr++ = GP1_XF_PGON_FLT_2D;	*ptr++ = 1;	*ptr++ = 4;	tempf = x;     GP1_PUT_F(ptr, tempf);	tempf = y-.15; GP1_PUT_F(ptr, tempf);	tempf = x-.05; GP1_PUT_F(ptr, tempf);	tempf = y-.05; GP1_PUT_F(ptr, tempf);	tempf = x;     GP1_PUT_F(ptr, tempf);	tempf = y+.05; GP1_PUT_F(ptr, tempf);	tempf = x+.05; GP1_PUT_F(ptr, tempf);	tempf = y-.05; GP1_PUT_F(ptr, tempf);    }    else {	if (poly) {	    *ptr++ = GP1_XF_PGON_FLT_3D/* _RGB */;	    *ptr++ = 1;	    *ptr++ = 4;	    tempf = x;     GP1_PUT_F(ptr, tempf);	    tempf = y-.15; GP1_PUT_F(ptr, tempf);	    GP1_PUT_F(ptr, z);	}	else {	    *ptr++ = GP2_XF_TRISTRIP_FLT_3D_RGB;	    *ptr++ = 3;	}	tempf = x-.05; GP1_PUT_F(ptr, tempf);	tempf = y-.05; GP1_PUT_F(ptr, tempf);	GP1_PUT_F(ptr, z);	tempf = x;     GP1_PUT_F(ptr, tempf);	tempf = y+.05; GP1_PUT_F(ptr, tempf);	GP1_PUT_F(ptr, z);	tempf = x+.05; GP1_PUT_F(ptr, tempf);	tempf = y-.05; GP1_PUT_F(ptr, tempf);	GP1_PUT_F(ptr, z);    }    (void)postbuf(ptr);    return (0);}/**********************************************************************/fast_clear()/**********************************************************************/{     short *ptr;     float r,g,b;     ptr = allocbuf();     if (ptr == (short *)-1) {	alloc_err = -1;	return(0);     }     r = 0.0;     g = 0.0;     b = 0.0;     *ptr++ = GP2_SET_RGB_COLOR | GP2_RGB_COLOR_TRIPLE; /*set marker color*/     GP1_PUT_F(ptr,r);     GP1_PUT_F(ptr,g);     GP1_PUT_F(ptr,b);     *ptr++ = GP1_SET_ZBUF | 3; /*clear everything*/     *ptr++ = 0xffff ;      *ptr++ = 0 ;      *ptr++ = 0 ;      *ptr++ = 1152 ;      *ptr++ = 900 ;      (void)postbuf(ptr);     return (0);}

⌨️ 快捷键说明

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