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

📄 draw.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*	draw.c	1.1	92/07/30	*/#include <usercore.h>#include <sun/fbio.h>#include "demolib.h"#define MAPSIZE		256static int colortable[] = {     1,  20,  40, 63 , 85, 105,				127, 147, 167, 191, 254, 255 };static int main_menu = 1,  attribute_menu = 2, menus = 2;static int newseg = 3, segopen, opensegment;static float xlist[100], ylist[100];static int pointcount, colorflag;double sin(), cos();static int cg1dd();static int cg2dd();static int cg4dd();static int cgpixwindd();static int gp1dd();static int gp1pixwindd();/*-----------------Main--------------------*/main(argc, argv) int argc; char *argv[];{    int done, segnam, pickid;    set_up_core(argv);    if((our_surface->dd == cg1dd) || (our_surface->dd == cgpixwindd) ||	(our_surface->dd==cg2dd) || (our_surface->dd==cg4dd) ||	(our_surface->dd==gp1dd) || (our_surface->dd==gp1pixwindd))	colorflag=TRUE;    else	colorflag=FALSE;    build_menus();    done = FALSE;    set_segment_visibility( main_menu, TRUE);    while ( !done) {        set_echo( LOCATOR,1, 1);		/* dingbat to menu */	set_echo( PICK, 1,2);	await_pick( 1000000, 1, &segnam, &pickid);	/* pick menu item */	if (segnam == main_menu) {	    set_segment_visibility( main_menu, FALSE);	    switch (pickid) {	    case 1: make_new_seg( XLATE2); break;	/* translatable seg */	    case 2: make_new_seg( XFORM2); break;	/* New transform seg */	    case 3: 					/* Delete segment */		await_pick( 100000000,1,&segnam,&pickid);/* pick segment */		if (segnam > menus) {		    inquire_open_retained_segment( &opensegment);		    delete_retained_segment( segnam);		    if (opensegment == segnam) segopen = FALSE;		}		break;	    case 4: go_draw_polyline(1); break;		/* Polyline draw */	    case 5: go_draw_polygon();   break;		/* Polygon draw */	    case 6: go_draw_raster();    break;		/* Raster draw */	    case 7: go_draw_text();      break;		/* Text draw  */	    case 8: go_draw_polyline(0); break;		/* Marker draw  */	    case 9: go_transform_segment(0); break;	/* Position segment */	    case 10: go_transform_segment(1); break;	/* Rotate segment  */	    case 11: go_transform_segment(2); break;	/* Size segment  */	    case 12: process_attribute_menu(); break;	/* attributes  */	    case 13: go_save_segment();	break;		/* save segment  */	    case 14: go_restore_segment(); break;	/* restore segment  */	    case 15:		if (segopen) close_retained_segment();	/* EXIT     */		done = TRUE; break;	    default:	        set_segment_visibility( main_menu, FALSE);		new_frame();	    }	    set_segment_visibility( main_menu, TRUE);	    }    }    terminate_device( KEYBOARD, 1);    terminate_device( LOCATOR, 1);    deselect_view_surface(our_surface);    terminate_view_surface(our_surface);    terminate_core();    return 0;}/*-------------------------------------------*/go_draw_raster()		/* get raster prim from bitmap */{    int rasfid; char *rasfilename;    int butnum;    float xmin, ymin, x, y, xmax, ymax;    float wx, wy;    struct { int width, height, depth;	short *bits; }raster;    struct { int type, nbytes;	char *data; }map;    set_echo( LOCATOR,1, 6);			/* dingbat to start position */    do {	await_any_button_get_locator_2( 1000000,1, &butnum, &xmax, &ymax);        if (butnum == 1) {	    set_echo_position( LOCATOR,1, xmax, ymax);	    xmin = xmax; ymin = ymax;	}    } while (butnum != 3);    if (xmax<xmin) { x=xmax; xmax=xmin; xmin=x;}    if (ymax<ymin) { y=ymax; ymax=ymin; ymin=y;}        x = xmin;  y = ymin;    map_ndc_to_world_2( x, y, &wx, &wy);    set_pick_id( 1);    move_abs_2( wx, wy);    size_raster( our_surface, xmin, xmax, ymin, ymax, &raster);    allocate_raster( &raster);    get_raster( our_surface, xmin, xmax, ymin, ymax, 0, 0, &raster);    if (raster.bits) {	put_raster( &raster);	rasfilename = "rasterfile";	if( (rasfid = open( rasfilename, 1)) == -1) {	/* open the disk file */	    rasfid = creat( rasfilename, 0755);	    }	if (rasfid != -1) {	    map.type = 1;  map.nbytes = 0;  map.data = 0;	    raster_to_file( &raster, &map, rasfid, 1);	    close( rasfid);	    }	free_raster( &raster);    }    set_segment_detectability( opensegment, 5);}/*-------------------------------------------------------*/make_new_seg( type) int type;{    if (segopen) close_retained_segment();    set_image_transformation_type( type);    opensegment = newseg++;    create_retained_segment( opensegment);    set_primitive_attributes( &PRIMATTS);    segopen = TRUE;}/*--------------------------------------------------------------------*/process_attribute_menu(){    int done, segnam, pickid, butnum;    set_segment_visibility( attribute_menu, TRUE);    done = FALSE;    while ( !done) {        set_echo( LOCATOR,1, 1);		/* dingbat to menu */	await_pick( 1000000, 1, &segnam, &pickid);	/* pick menu item */	if (segnam == 0) { 	    await_any_button( 0, &butnum);	    if (butnum == 3) done = TRUE;	}	else if (segnam == attribute_menu) {	    if (pickid > 1  && pickid < 8 ) {		set_charprecision( CHARACTER);		set_font( pickid - 2);	    }	    else if (pickid > 7  && pickid < 12)		set_linestyle( pickid - 8);	    else if (pickid > 15 && pickid < 20)		set_linewidth( (pickid-16)* 0.25);	    else if (pickid > 19 && pickid < 32){		set_line_index( colortable[pickid-20]);		set_fill_index( colortable[pickid-20]);		set_text_index( colortable[pickid-20]);		}	    else break;				/* EXIT     */	}    }    set_segment_visibility( attribute_menu, FALSE);}/*---------------------------------------------------------------------*/go_transform_segment( mode) int mode;	/* position 0,rotate 1,size 2 */{    int segnam, pickid, butnum, segtype;    float sx0, sy0, ang0, tx0, ty0;    float sx, sy, ang, tx, ty;    float x, y, px, py;    float dx, dy, nx, ny, sina, cosa;    await_pick( 1000000000, 1, &segnam, &pickid);	/* pick segment */    if (segnam <= 0) return (0);    await_any_button_get_locator_2( 0,1, &butnum, &px, &py);    inquire_segment_image_transformation_2( segnam,&sx0,&sy0,&ang0,&tx0,&ty0);    sina = sin(ang0); cosa = cos(ang0);    dx = px - (sx0 * cosa * px - sy0 * sina * py);    dy = py - (sx0 * sina * px + sy0 * cosa * py);    inquire_segment_image_transformation_type( segnam, &segtype);    set_echo( LOCATOR,1, 0);			/* no echo, drag segment */    do {	await_any_button_get_locator_2( 0,1, &butnum, &x, &y);	switch (mode) {			/* case mode of */	case 0:					/* position segment */	    tx = tx0 + (x-px);  ty = ty0 + (y-py);	    if (segtype <= XLATE2)		set_segment_image_translate_2( segnam, tx,ty);	    else		set_segment_image_transformation_2( segnam, sx0,sy0,ang0,tx,ty);	    break;	case 1:					/* rotate segment */	    ang = ang0 + (x-px) * 6.28;	    sina = sin(ang); cosa = cos(ang);	    nx = px - (sx0 * cosa * px - sy0 * sina * py);	    ny = py - (sx0 * sina * px + sy0 * cosa * py);	    tx = tx0 + nx - dx;	    ty = ty0 + ny - dy;	    set_segment_image_transformation_2( segnam, sx0,sy0,ang,tx,ty);	    if (segtype != XFORM2) return(0);	    break;	case 2:					/* size segment */	    sx = sx0 + (x-px) * 15.;  sy = sy0 + (y-py) * 15.;	    sina = sin(ang0); cosa = cos(ang0);	    nx = px - (sx * cosa * px - sy * sina * py);	    ny = py - (sx * sina * px + sy * cosa * py);	    tx = tx0 + nx - dx;	    ty = ty0 + ny - dy;	    set_segment_image_transformation_2( segnam, sx,sy,ang0,tx,ty);	    if (segtype != XFORM2) return(0);	    break;	default:;	}    } while (butnum != 3);}/*-------------------------------------------*/go_save_segment(){	char string[80];  int length;	int segnam, pickid;	await_pick( 100000000, 1, &segnam, &pickid);	if (segnam > menus) {	    if (segopen && opensegment == segnam) {		close_retained_segment();	        segopen = FALSE;		}

⌨️ 快捷键说明

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