📄 draw.c
字号:
/* 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 + -