1 /*----------------------------------------------------------------------*/ 2 /* xcircuit.h */ 3 /* Copyright (c) 2002 Tim Edwards, Johns Hopkins University */ 4 /*----------------------------------------------------------------------*/ 5 6 /*----------------------------------------------------------------------*/ 7 /* written by Tim Edwards, 8/20/93 */ 8 /*----------------------------------------------------------------------*/ 9 10 #ifndef HAVE_U_CHAR 11 typedef unsigned char u_char; 12 typedef unsigned short u_short; 13 typedef unsigned int u_int; 14 typedef unsigned long u_long; 15 typedef unsigned long long u_long_long; 16 #endif 17 18 #ifdef XC_WIN32 19 #ifdef TCL_WRAPPER 20 #include "tkwin32.h" 21 #else 22 #include "xcwin32.h" 23 #endif 24 #endif 25 26 #ifdef HAVE_CAIRO 27 #include <cairo/cairo.h> 28 #endif 29 30 /*----------------------------------------------------------------------*/ 31 /* portable definition to prevent unused variables warning */ 32 /*----------------------------------------------------------------------*/ 33 34 #define UNUSED(x) (void) x 35 36 /*----------------------------------------------------------------------*/ 37 /* Graphics functions defined for X11 */ 38 /*----------------------------------------------------------------------*/ 39 40 #ifdef HAVE_CAIRO 41 42 #define SetForeground(display, gc, fg) xc_cairo_set_color(fg) 43 typedef cairo_surface_t xcImage; 44 45 #else /* !HAVE_CAIRO */ 46 47 typedef XImage xcImage; 48 #define DrawLine XDrawLine 49 #define DrawLines XDrawLines 50 #define DrawPoint XDrawPoint 51 #define FillPolygon XFillPolygon 52 53 #define SetForeground(dpy, gc, fg) XSetForeground(dpy, gc, colorlist[fg].color.pixel) 54 #define SetBackground(dpy, gc, bg) XSetBackground(dpy, gc, colorlist[bg].color.pixel) 55 #define SetThinLineAttributes XSetLineAttributes 56 #define SetLineAttributes(a, b, c, d, e, f) \ 57 XSetLineAttributes(a, b, ((c) >= 1.55 ? (int)(c + 0.45) : 0), d, e, f) 58 #define SetDashes XSetDashes 59 #define SetFillStyle XSetFillStyle 60 #define SetStipple(a,b,c) XSetStipple(a,b,STIPPLE[c]) 61 62 #endif /* !HAVE_CAIRO */ 63 64 #define flusharea() 65 66 /*----------------------------------------------------------------------*/ 67 /* Redefinition of fprintf() allows redirection of output to a console */ 68 /* in the Tcl interpreter-based version. */ 69 /*----------------------------------------------------------------------*/ 70 71 #ifdef TCL_WRAPPER 72 #define Fprintf tcl_printf 73 #define Flush tcl_stdflush 74 #else 75 #define Fprintf fprintf 76 #define Flush fflush 77 #endif 78 79 #ifdef TCL_WRAPPER 80 #define malloc Tcl_Alloc 81 /* (see definition of my_calloc in the asg subdirectory) */ 82 /* #define calloc(a,b) Tcl_Alloc(a * b) */ 83 #define free(a) Tcl_Free((char *)(a)) 84 #define realloc(a,b) Tcl_Realloc((char *)(a), b) 85 #undef strdup 86 #define strdup Tcl_Strdup 87 extern char *Tcl_Strdup(const char *); 88 #endif 89 90 /*----------------------------------------------------------------------*/ 91 /* Deal with 32/64 bit processors based on autoconf results. */ 92 /*----------------------------------------------------------------------*/ 93 94 #ifndef SIZEOF_VOID_P 95 #error "SIZEOF_VOID_P undefined!" 96 #endif 97 #ifndef SIZEOF_UNSIGNED_INT 98 #error "SIZEOF_UNSIGNED_INT undefined!" 99 #endif 100 #ifndef SIZEOF_UNSIGNED_LONG 101 #error "SIZEOF_UNSIGNED_LONG undefined!" 102 #endif 103 #ifndef SIZEOF_UNSIGNED_LONG_LONG 104 #error "SIZEOF_UNSIGNED_LONG_LONG undefined!" 105 #endif 106 107 #if SIZEOF_VOID_P == SIZEOF_UNSIGNED_INT 108 #define Number(a) (void *)((u_int) a) 109 typedef u_int pointertype; 110 #elif SIZEOF_VOID_P == SIZEOF_UNSIGNED_LONG 111 #define Number(a) (void *)((u_long) a) 112 typedef u_long pointertype; 113 #elif SIZEOF_VOID_P == SIZEOF_UNSIGNED_LONG_LONG 114 #define Number(a) (void *)((u_long_long) a) 115 typedef u_long_long pointertype; 116 #else 117 ERROR: Cannot compile without knowing the size of a pointer. See xcircuit.h. 118 #endif 119 120 /*----------------------------------------------------------------------*/ 121 /* Basic element types */ 122 /* */ 123 /* These values determine how a genericptr should be cast into one of */ 124 /* labelptr, polyptr, etc. To query the element type, use the macros */ 125 /* ELEMENTTYPE(), IS_LABEL(), IS_POLYGON(), etc. These macros mask the */ 126 /* bit field. Note that an element marked with REMOVE_TAG will not be */ 127 /* recognized as any valid element, but otherwise, querying the type is */ 128 /* transparent to other bit settings (such as NETLIST_INVALID). */ 129 /*----------------------------------------------------------------------*/ 130 131 /* Single-bit flags */ 132 #define OBJINST 0x01 133 #define LABEL 0x02 134 #define POLYGON 0x04 135 #define ARC 0x08 136 #define SPLINE 0x10 137 #define PATH 0x20 138 #define GRAPHIC 0x40 139 #define ARRAY 0x80 /* reserved; unused, for now. */ 140 141 #define REMOVE_TAG 0x100 /* element to be removed from netlist */ 142 #define NETLIST_INVALID 0x200 /* this element invalidates the netlist */ 143 #define SELECT_HIDE 0x400 /* this element cannot be selected */ 144 #define DRAW_HIDE 0x800 /* this element is not drawn. */ 145 146 /* Bit fields */ 147 #define ALL_TYPES (OBJINST | LABEL | POLYGON | ARC | SPLINE | PATH \ 148 | GRAPHIC | ARRAY) 149 #define VALID_TYPES (REMOVE_TAG | ALL_TYPES) 150 151 /*----------------------------------------------------------------------*/ 152 /* Definition shortcuts */ 153 /*----------------------------------------------------------------------*/ 154 155 #define XtnSetArg(a,b) XtSetArg(wargs[n], a, b); n++ 156 #define abs(a) ((a) < 0 ? -(a) : (a)) 157 #define sign(a) ((a) <= 0 ? -1 : 1) 158 #ifndef min 159 #define max(a,b) ((a) < (b) ? (b) : (a)) 160 #define min(a,b) ((a) < (b) ? (a) : (b)) 161 #endif 162 163 /*----------------------------------------------------------------------*/ 164 /* Lengthier define constructs */ 165 /*----------------------------------------------------------------------*/ 166 167 /* Names used for convenience throughout the source code */ 168 169 #define eventmode areawin->event_mode 170 #define topobject areawin->topinstance->thisobject 171 #define hierobject areawin->hierstack->thisinst->thisobject 172 173 #define PLIST_INCR(a) \ 174 (a)->plist = (genericptr *) realloc ((a)->plist, \ 175 ((a)->parts + 1) * sizeof(genericptr)) 176 177 #define ENDPART topobject->plist + topobject->parts - 1 178 #define EDITPART topobject->plist + *areawin->selectlist 179 180 /* Type checks (argument "a" is type genericptr) */ 181 182 #define ELEMENTTYPE(a) ((a)->type & VALID_TYPES) 183 184 #define IS_POLYGON(a) (ELEMENTTYPE(a) == POLYGON) 185 #define IS_LABEL(a) (ELEMENTTYPE(a) == LABEL) 186 #define IS_OBJINST(a) (ELEMENTTYPE(a) == OBJINST) 187 #define IS_ARC(a) (ELEMENTTYPE(a) == ARC) 188 #define IS_SPLINE(a) (ELEMENTTYPE(a) == SPLINE) 189 #define IS_PATH(a) (ELEMENTTYPE(a) == PATH) 190 #define IS_GRAPHIC(a) (ELEMENTTYPE(a) == GRAPHIC) 191 #define IS_ARRAY(a) (ELEMENTTYPE(a) == ARRAY) 192 193 /* Conversions from generic to specific types */ 194 /* specifically, from type (genericptr *) to type (polyptr), etc. */ 195 196 #define TOPOLY(a) (*((polyptr *)(a))) 197 #define TOLABEL(a) (*((labelptr *)(a))) 198 #define TOOBJINST(a) (*((objinstptr *)(a))) 199 #define TOARC(a) (*((arcptr *)(a))) 200 #define TOSPLINE(a) (*((splineptr *)(a))) 201 #define TOPATH(a) (*((pathptr *)(a))) 202 #define TOGRAPHIC(a) (*((graphicptr *)(a))) 203 #define TOGENERIC(a) (*((genericptr *)(a))) 204 205 /* conversions from a selection to a specific type */ 206 207 #define SELTOGENERICPTR(a) ((areawin->hierstack == NULL) ? \ 208 (topobject->plist + *(a)) : \ 209 (hierobject->plist + *(a))) 210 211 #define SELTOPOLY(a) TOPOLY(SELTOGENERICPTR(a)) 212 #define SELTOLABEL(a) TOLABEL(SELTOGENERICPTR(a)) 213 #define SELTOOBJINST(a) TOOBJINST(SELTOGENERICPTR(a)) 214 #define SELTOARC(a) TOARC(SELTOGENERICPTR(a)) 215 #define SELTOSPLINE(a) TOSPLINE(SELTOGENERICPTR(a)) 216 #define SELTOPATH(a) TOPATH(SELTOGENERICPTR(a)) 217 #define SELTOGRAPHIC(a) TOGRAPHIC(SELTOGENERICPTR(a)) 218 #define SELTOGENERIC(a) TOGENERIC(SELTOGENERICPTR(a)) 219 220 #define SELECTTYPE(a) ((SELTOGENERIC(a))->type & ALL_TYPES) 221 #define SELTOCOLOR(a) ((SELTOGENERIC(a))->color) 222 223 224 /* creation of new elements */ 225 226 #define NEW_POLY(a,b) \ 227 PLIST_INCR(b); \ 228 a = (polyptr *)b->plist + b->parts; \ 229 *a = (polyptr) malloc(sizeof(polygon)); \ 230 b->parts++; \ 231 (*a)->type = POLYGON 232 #define NEW_LABEL(a,b) \ 233 PLIST_INCR(b); \ 234 a = (labelptr *)b->plist + b->parts; \ 235 *a = (labelptr) malloc(sizeof(label)); \ 236 b->parts++; \ 237 (*a)->type = LABEL 238 #define NEW_OBJINST(a,b) \ 239 PLIST_INCR(b); \ 240 a = (objinstptr *)b->plist + b->parts; \ 241 *a = (objinstptr) malloc(sizeof(objinst)); \ 242 b->parts++; \ 243 (*a)->type = OBJINST 244 #define NEW_ARC(a,b) \ 245 PLIST_INCR(b); \ 246 a = (arcptr *)b->plist + b->parts; \ 247 *a = (arcptr) malloc(sizeof(arc)); \ 248 b->parts++; \ 249 (*a)->type = ARC 250 #define NEW_SPLINE(a,b) \ 251 PLIST_INCR(b); \ 252 a = (splineptr *)b->plist + b->parts; \ 253 *a = (splineptr) malloc(sizeof(spline)); \ 254 b->parts++; \ 255 (*a)->type = SPLINE 256 #define NEW_PATH(a,b) \ 257 PLIST_INCR(b); \ 258 a = (pathptr *)b->plist + b->parts; \ 259 *a = (pathptr) malloc(sizeof(path)); \ 260 b->parts++; \ 261 (*a)->type = PATH 262 #define NEW_GRAPHIC(a,b) \ 263 PLIST_INCR(b); \ 264 a = (graphicptr *)b->plist + b->parts; \ 265 *a = (graphicptr) malloc(sizeof(graphic)); \ 266 b->parts++; \ 267 (*a)->type = GRAPHIC 268 269 /*----------------------------------------------------------------------*/ 270 271 typedef struct { 272 float x, y; 273 } XfPoint; 274 275 typedef struct { 276 long x, y; 277 } XlPoint; 278 279 typedef struct { 280 short width, ascent, descent, base; 281 int maxwidth; 282 } TextExtents; 283 284 typedef struct { 285 float *padding; /* Allocated array of padding info per line */ 286 XPoint *tbreak; /* Position in text to stop */ 287 short dostop; /* Location (index) in text to stop */ 288 short line; /* Stop line number, if using dostop or tbreak. */ 289 } TextLinesInfo; 290 291 /*----------------------------------------------------------------------*/ 292 /* Implementation-specific definitions */ 293 /*----------------------------------------------------------------------*/ 294 295 #define LIBS 5 /* initial number of library pages */ 296 #define PAGES 10 /* default number of top-level pages */ 297 #define SCALEFAC 1.5 /* zoom in/out scaling multiplier */ 298 #define SUBSCALE 0.67 /* ratio of subscript size to normal script size */ 299 #define SBARSIZE 13 /* Pixel size of the scrollbar */ 300 #define RSTEPS 72 /* Number of points defining a circle approx. */ 301 #define SPLINESEGS 20 /* Number of points per spline approximation */ 302 #define DELBUFSIZE 10 /* Number of delete events to save for undeleting */ 303 #define MINAUTOSCALE 0.75 /* Won't automatically scale closer than this */ 304 #define MAXCHANGES 20 /* Number of changes to induce a temp file save */ 305 #define STIPPLES 8 /* Number of predefined stipple patterns */ 306 #define PADSPACE 10 /* Spacing of pinlabels from their origins */ 307 308 #ifdef HAVE_XPM 309 #define TBBORDER 1 /* border around toolbar buttons */ 310 #endif 311 312 #define TOPLEVEL 0 313 #define SINGLE 1 314 315 #define INTSEGS (SPLINESEGS - 2) 316 #define LASTSEG (SPLINESEGS - 3) 317 318 #define NOFILENAME (char *)(-1) 319 320 #define FONTHEIGHT(y) (y->ascent + y->descent + 6) 321 #define ROWHEIGHT FONTHEIGHT(appdata.xcfont) 322 #define FILECHARASCENT (appdata.filefont->ascent) 323 #define FILECHARHEIGHT (FILECHARASCENT + appdata.filefont->descent) 324 #define LISTHEIGHT 200 325 #define TEXTHEIGHT 28 /* Height of xcircuit vectored font at nominal size */ 326 #define BASELINE 40 /* Height of baseline */ 327 #define DEFAULTGRIDSPACE 32 328 #define DEFAULTSNAPSPACE 16 329 330 /*----------------------------------------------------------------------*/ 331 332 #define RADFAC 0.0174532925199 /* (pi / 180) */ 333 #define INVRFAC 57.295779 /* (180 / pi) */ 334 335 /*----------------------------------------------------------------------*/ 336 337 #define INCHSCALE 0.375 /* Scale of .25 inches to PostScript units */ 338 #define CMSCALE 0.35433071 /* Scale of .5 cm to PostScript units */ 339 #define IN_CM_CONVERT 28.3464567 /* 72 (in) / 2.54 (cm/in) */ 340 341 /*----------------------------------------------------------------------*/ 342 /* Event mode definitions (state of drawing area) */ 343 /*----------------------------------------------------------------------*/ 344 345 typedef enum editmode { 346 NORMAL_MODE = 0, /* On the drawing page, none of the situations below */ 347 UNDO_MODE, /* In the process of an undo/redo operation */ 348 MOVE_MODE, /* In the process of moving elements */ 349 COPY_MODE, /* In the process of copying elements */ 350 PAN_MODE, /* In the process of panning to follow the cursor */ 351 SELAREA_MODE, /* Area selection box */ 352 RESCALE_MODE, /* Interactive element rescaling box */ 353 CATALOG_MODE, /* On a library page, library directory, or page directory */ 354 CATTEXT_MODE, /* Editing an existing object name in the library */ 355 FONTCAT_MODE, /* Accessing the font character page from TEXT_MODE */ 356 EFONTCAT_MODE, /* Accessing the font character page from ETEXT_MODE */ 357 TEXT_MODE, /* Creating a new label */ 358 WIRE_MODE, /* Creating a new polygon (wire) */ 359 BOX_MODE, /* Creating a new box */ 360 ARC_MODE, /* Creating a new arc */ 361 SPLINE_MODE, /* Creating a new spline */ 362 ETEXT_MODE, /* Editing an exiting label */ 363 EPOLY_MODE, /* Editing an existing polygon */ 364 EARC_MODE, /* Editing an existing arc */ 365 ESPLINE_MODE, /* Editing an existing spline */ 366 EPATH_MODE, /* Editing an existing path */ 367 EINST_MODE, /* Editing an instance (from the level above) */ 368 ASSOC_MODE, /* Choosing an associated schematic or symbol */ 369 CATMOVE_MODE /* Moving objects in or between libraries */ 370 } event_mode_t; 371 372 /*----------------------------------------------------------------------*/ 373 /* File loading modes */ 374 /*----------------------------------------------------------------------*/ 375 376 enum loadmodes {IMPORT = 1, PSBKGROUND, SCRIPT, RECOVER, 377 #ifdef ASG 378 IMPORTSPICE, 379 #endif 380 #ifdef HAVE_CAIRO 381 IMPORTGRAPHIC, 382 #endif 383 LOAD_MODES 384 }; 385 386 /*----------------------------------------------------------------------*/ 387 /* Text anchoring styles and other parameters (bitmask) */ 388 /*----------------------------------------------------------------------*/ 389 390 #define NOTLEFT 1 /* Center or right anchoring */ 391 #define RIGHT 2 /* Right anchoring */ 392 #define NOTBOTTOM 4 /* Middle or top anchoring */ 393 #define TOP 8 /* Top anchoring */ 394 #define FLIPINV 16 /* 1 if text is flip-invariant */ 395 #define PINVISIBLE 32 /* 1 if pin visible outside of object */ 396 #define PINNOOFFSET 64 /* 0 if pin label offset from position */ 397 #define LATEXLABEL 128 /* 1 if label is in LaTeX syntax */ 398 #define JUSTIFYRIGHT 256 /* Right text justification */ 399 #define JUSTIFYBOTH 512 /* Right and left text justification */ 400 #define TEXTCENTERED 1024 /* Centered text */ 401 402 #define RLANCHORFIELD 3 /* right-left anchoring bit field */ 403 #define TBANCHORFIELD 12 /* top-bottom anchoring bit field */ 404 #define NONANCHORFIELD 2032 /* everything but anchoring fields */ 405 #define NONJUSTIFFIELD 255 /* everything but justification fields */ 406 407 /*----------------------------------------------------------------------*/ 408 /* Text string part: types */ 409 /*----------------------------------------------------------------------*/ 410 411 #define TEXT_STRING 0 /* data is a text string */ 412 #define SUBSCRIPT 1 /* start subscript; no data */ 413 #define SUPERSCRIPT 2 /* start superscript; no data */ 414 #define NORMALSCRIPT 3 /* stop super-/subscript; no data */ 415 #define UNDERLINE 4 /* start underline; no data */ 416 #define OVERLINE 5 /* start overline; no data */ 417 #define NOLINE 6 /* stop over-/underline; no data */ 418 #define TABSTOP 7 /* insert tab stop position */ 419 #define TABFORWARD 8 /* insert tab stop position */ 420 #define TABBACKWARD 9 /* insert tab stop position */ 421 #define HALFSPACE 10 /* insert half-space; no data */ 422 #define QTRSPACE 11 /* insert quarter space; no data */ 423 #define RETURN 12 /* carriage-return character; no data */ 424 #define FONT_NAME 13 /* inline font designator; data = font name */ 425 #define FONT_SCALE 14 /* font scale change; data = scale */ 426 #define FONT_COLOR 15 /* font color change; data = color */ 427 #define MARGINSTOP 16 /* declare a width limit for the text */ 428 #define KERN 17 /* set new kern values; data = kern x, y */ 429 #define PARAM_START 18 /* bounds a parameter; data = param key */ 430 #define PARAM_END 19 /* bounds a parameter; no data */ 431 432 /* Actions translated to keystates (numbering continues from above) */ 433 434 #define TEXT_RETURN 20 435 #define TEXT_HOME 21 436 #define TEXT_END 22 437 #define TEXT_SPLIT 23 438 #define TEXT_DOWN 24 439 #define TEXT_UP 25 440 #define TEXT_LEFT 26 441 #define TEXT_RIGHT 27 442 #define TEXT_DELETE 28 443 #define TEXT_DEL_PARAM 29 444 445 #define SPECIAL 63 /* used only when called from menu */ 446 #define NULL_TYPE 255 /* used as a placeholder */ 447 448 /*----------------------------------------------------------------------*/ 449 /* Reset modes */ 450 /*----------------------------------------------------------------------*/ 451 452 #define SAVE 1 453 #define DESTROY 2 454 455 /*----------------------------------------------------------------------*/ 456 /* Coordinate display types */ 457 /*----------------------------------------------------------------------*/ 458 459 #define DEC_INCH 0 460 #define FRAC_INCH 1 461 #define CM 2 462 #define INTERNAL 3 463 464 /*----------------------------------------------------------------------*/ 465 /* Library types */ 466 /*----------------------------------------------------------------------*/ 467 468 #define FONTENCODING -1 /* Used only by libopen() */ 469 #define FONTLIB 0 470 #define PAGELIB 1 471 #define LIBLIB 2 472 #define LIBRARY 3 473 #define USERLIB (xobjs.numlibs + LIBRARY - 1) 474 475 /*----------------------------------------------------------------------*/ 476 /* Object instance styles */ 477 /*----------------------------------------------------------------------*/ 478 479 #define LINE_INVARIANT 1 /* Linewidth is invariant w.r.t. scale */ 480 #define INST_NONETLIST 2 /* Instance is not netlistable */ 481 482 /*----------------------------------------------------------------------*/ 483 /* Box styles */ 484 /*----------------------------------------------------------------------*/ 485 486 #define NORMAL 0 487 #define UNCLOSED 1 488 #define DASHED 2 489 #define DOTTED 4 490 #define NOBORDER 8 491 #define FILLED 16 492 #define STIP0 32 493 #define STIP1 64 494 #define STIP2 128 495 #define FILLSOLID 224 /* = 32 + 64 + 128 */ 496 #ifdef OPAQUE 497 #undef OPAQUE 498 #endif 499 #define OPAQUE 256 500 #define BBOX 512 501 #define SQUARECAP 1024 502 #define CLIPMASK 2048 503 #define FIXEDBBOX 4096 504 505 /*----------------------------------------------------------------------*/ 506 /* Box edit styles */ 507 /*----------------------------------------------------------------------*/ 508 509 #define NONE 0 510 #define MANHATTAN 1 511 #define RHOMBOIDX 2 512 #define RHOMBOIDY 4 513 #define RHOMBOIDA 8 514 515 /*----------------------------------------------------------------------*/ 516 /* Path edit styles */ 517 /*----------------------------------------------------------------------*/ 518 519 #define TANGENTS 1 /* (NORMAL = 0) */ 520 521 /*----------------------------------------------------------------------*/ 522 /* Cycle points (selected points) (flag bits, can be OR'd together) */ 523 /*----------------------------------------------------------------------*/ 524 525 #define EDITX 0x01 526 #define EDITY 0x02 527 #define LASTENTRY 0x04 528 #define PROCESS 0x08 529 #define REFERENCE 0x10 530 #define ANTIXY 0x20 /* For matched-tangent curves */ 531 532 /*----------------------------------------------------------------------*/ 533 /* Arc creation and edit styles */ 534 /*----------------------------------------------------------------------*/ 535 536 #define CENTER 1 537 #define RADIAL 2 538 539 /*----------------------------------------------------------------------*/ 540 /* Delete/undelete draw-mode styles */ 541 /*----------------------------------------------------------------------*/ 542 543 #define ERASE 1 544 #define DRAW 1 545 546 /*----------------------------------------------------------------------*/ 547 /* Schematic object types and pin label types */ 548 /*----------------------------------------------------------------------*/ 549 550 #define PRIMARY 0 /* Primary (master) schematic page */ 551 #define SECONDARY 1 /* Secondary (slave) schematic page */ 552 #define TRIVIAL 2 /* Symbol as non-schematic element */ 553 #define SYMBOL 3 /* Symbol associated with a schematic */ 554 #define FUNDAMENTAL 4 /* Standalone symbol */ 555 #define NONETWORK 5 /* Do not netlist this object */ 556 #define GLYPH 6 /* Symbol is a font glyph */ 557 558 #define LOCAL 1 559 #define GLOBAL 2 560 #define INFO 3 561 562 #define HIERARCHY_LIMIT 256 /* Stop if recursion goes this deep */ 563 564 /*----------------------------------------------------------------------*/ 565 /* Save types. This list incorporates "ALL_PAGES", below. */ 566 /*----------------------------------------------------------------------*/ 567 568 #define CURRENT_PAGE 0 /* Current page + all associated pages */ 569 #define NO_SUBCIRCUITS 1 /* Current page w/o subcircuit pages */ 570 571 /*----------------------------------------------------------------------*/ 572 /* Modes used when ennumerating page totals. */ 573 /*----------------------------------------------------------------------*/ 574 575 #define INDEPENDENT 0 576 #define DEPENDENT 1 577 #define TOTAL_PAGES 2 578 #define LINKED_PAGES 3 579 #define PAGE_DEPEND 4 580 #define ALL_PAGES 5 581 582 /*----------------------------------------------------------------------*/ 583 /* Color scheme styles (other than NORMAL) */ 584 /*----------------------------------------------------------------------*/ 585 586 #define INVERSE 1 587 588 /*----------------------------------------------------------------------*/ 589 /* Cursor definitions */ 590 /*----------------------------------------------------------------------*/ 591 592 #define NUM_CURSORS 11 593 594 #define ARROW appcursors[0] 595 #define CROSS appcursors[1] 596 #define SCISSORS appcursors[2] 597 #define COPYCURSOR appcursors[3] 598 #define ROTATECURSOR appcursors[4] 599 #define EDCURSOR appcursors[5] 600 #define TEXTPTR appcursors[6] 601 #define CIRCLE appcursors[7] 602 #define QUESTION appcursors[8] 603 #define WAITFOR appcursors[9] 604 #define HAND appcursors[10] 605 606 #define DEFAULTCURSOR (*areawin->defaultcursor) 607 608 /*----------------------------------------------------------------------*/ 609 /* integer and floating-point coordinate list structures */ 610 /*----------------------------------------------------------------------*/ 611 612 typedef XPoint* pointlist; 613 typedef XfPoint* fpointlist; 614 615 /*----------------------------------------------------------------------*/ 616 /* Allowed parameterization types */ 617 /*----------------------------------------------------------------------*/ 618 619 enum paramwhich { 620 P_NUMERIC = 0, /* uncommitted numeric parameter */ 621 P_SUBSTRING, 622 P_POSITION_X, 623 P_POSITION_Y, 624 P_STYLE, 625 P_ANCHOR, 626 P_ANGLE1, 627 P_ANGLE2, 628 P_RADIUS, 629 P_MINOR_AXIS, 630 P_ROTATION, 631 P_SCALE, 632 P_LINEWIDTH, 633 P_COLOR, 634 P_EXPRESSION, 635 P_POSITION, /* mode only, not a real parameter */ 636 NUM_PARAM_TYPES 637 }; 638 639 /*----------------------------------------------------------------------*/ 640 /* Labels are constructed of strings and executables */ 641 /*----------------------------------------------------------------------*/ 642 643 typedef struct _stringpart *stringptr; 644 645 typedef struct _stringpart { 646 stringptr nextpart; 647 u_char type; 648 union { 649 u_char *string; 650 int color; 651 int font; 652 int width; 653 int flags; 654 float scale; 655 short kern[2]; 656 } data; 657 } stringpart; 658 659 /*----------------------------------------------------------------------*/ 660 /* structures of all main elements which can be displayed & manipulated */ 661 /*----------------------------------------------------------------------*/ 662 663 /*----------------------------------------------------------------------*/ 664 /* Object & object instance parameter structure */ 665 /* (Add types as necessary) */ 666 /*----------------------------------------------------------------------*/ 667 668 enum paramtypes {XC_INT = 0, XC_FLOAT, XC_STRING, XC_EXPR}; 669 670 /* Object parameters: general key:value parameter model */ 671 /* Note that this really should be a hash table, not a linked list. . . */ 672 673 typedef struct _oparam *oparamptr; 674 675 typedef struct _oparam { 676 char * key; /* name of the parameter */ 677 u_char type; /* type is from paramtypes list above */ 678 u_char which; /* what the parameter represents (P_*) */ 679 union { 680 stringpart *string; /* xcircuit label type */ 681 char *expr; /* TCL (string) expression */ 682 int ivalue; /* also covers type short int by typecasting */ 683 float fvalue; 684 } parameter; /* default or substitution value */ 685 oparamptr next; /* next parameter in linked list */ 686 } oparam; 687 688 /* Element parameters: reference back to the object's parameters */ 689 /* These parameters are forward-substituted when descending into */ 690 /* an object instance. */ 691 /* Note that this really should be a hash table, not a linked list. . . */ 692 693 typedef struct _eparam *eparamptr; 694 695 typedef struct _eparam { 696 char * key; /* name of the parameter */ 697 u_char flags; /* namely, bit declaring an indirect parameter */ 698 union { 699 int pointno; /* point number in point array, for polygons */ 700 short pathpt[2]; /* element number and point number, for paths */ 701 char *refkey; /* parameter reference key, for instances */ 702 } pdata; 703 eparamptr next; /* next parameter in linked list */ 704 } eparam; 705 706 #define P_INDIRECT 0x01 /* indirect parameter indicator */ 707 708 /*----------------------------------------------------------------------*/ 709 /* Generic element type is a superset of all elements. */ 710 /*----------------------------------------------------------------------*/ 711 712 typedef struct { 713 u_short type; /* type is LABEL, POLYGON, etc., from below */ 714 int color; 715 eparamptr passed; 716 } generic, *genericptr; /* (convenience function for retypecasting) */ 717 718 /*----------------------------------------------------------------------*/ 719 /* selection-mechanism structures */ 720 /*----------------------------------------------------------------------*/ 721 722 typedef struct { 723 short number; 724 genericptr *element; 725 short *idx; 726 } uselection; 727 728 typedef struct { 729 short number; 730 u_char flags; 731 } pointselect; 732 733 /*----------------------------------------------------------------------*/ 734 /* Bounding box */ 735 /*----------------------------------------------------------------------*/ 736 737 typedef struct { 738 XPoint lowerleft; 739 Dimension width, height; 740 } BBox; 741 742 /*----------------------------------------------------------------------*/ 743 /* Object instance type */ 744 /*----------------------------------------------------------------------*/ 745 746 typedef struct _xcobject *objectptr; 747 748 typedef struct { 749 u_short type; 750 int color; 751 eparamptr passed; /* numerical parameters passed from above */ 752 u_short style; 753 XPoint position; 754 float rotation; 755 float scale; 756 objectptr thisobject; 757 oparamptr params; /* parameter substitutions for this instance */ 758 BBox bbox; /* per-instance bounding box information */ 759 BBox *schembbox; /* Extra bounding box for pin labels */ 760 } objinst, *objinstptr; 761 762 /* Linked-list for objects */ 763 764 typedef struct _objlist *objlistptr; 765 766 typedef struct _objlist { 767 int libno; /* library in which object appears */ 768 objectptr thisobject; /* pointer to the object */ 769 objlistptr next; 770 } objlist; 771 772 /* Linked-list for object instances */ 773 774 typedef struct _pushlist *pushlistptr; 775 776 typedef struct _pushlist { 777 objinstptr thisinst; 778 char *clientdata; /* general-purpose record */ 779 pushlistptr next; 780 } pushlist; 781 782 /* Same as above, but for the list of instances in a library, so it */ 783 /* needs an additional record showing whether or not the instance is */ 784 /* "virtual" (not the primary library instance of the object) */ 785 786 typedef struct _liblist *liblistptr; 787 788 typedef struct _liblist { 789 objinstptr thisinst; 790 u_char virtual; 791 liblistptr next; 792 } liblist; 793 794 /*----------------------------------------------------------------------*/ 795 /* Generalized graphic object (Tcl/Tk only) */ 796 /*----------------------------------------------------------------------*/ 797 798 typedef struct { 799 u_short type; 800 int color; /* foreground, for bitmaps only */ 801 eparamptr passed; /* numerical parameters passed from above */ 802 XPoint position; 803 float rotation; 804 float scale; 805 xcImage *source; /* source data */ 806 #ifndef HAVE_CAIRO 807 xcImage *target; /* target (scaled) data */ 808 float trot; /* target rotation */ 809 float tscale; /* target scale (0 = uninitialized) */ 810 Pixmap clipmask; /* clipmask for non-manhattan rotations */ 811 Boolean valid; /* does target need to be regenerated? */ 812 #endif /* !HAVE_CAIRO */ 813 } graphic, *graphicptr; 814 815 /*----------------------------------------------------------------------*/ 816 /* Label */ 817 /*----------------------------------------------------------------------*/ 818 819 typedef struct { 820 u_short type; 821 int color; 822 eparamptr passed; /* numerical parameters passed from above */ 823 pointselect *cycle; /* Edit position(s), or NULL */ 824 XPoint position; 825 float rotation; 826 float scale; 827 u_short anchor; 828 u_char pin; 829 stringpart *string; 830 } label, *labelptr; 831 832 /*----------------------------------------------------------------------*/ 833 /* Polygon */ 834 /*----------------------------------------------------------------------*/ 835 836 typedef struct { 837 u_short type; 838 int color; 839 eparamptr passed; /* numerical parameters passed from above */ 840 u_short style; 841 float width; 842 pointselect *cycle; /* Edit position(s), or NULL */ 843 short number; 844 pointlist points; 845 } polygon, *polyptr; 846 847 /*----------------------------------------------------------------------*/ 848 /* Bezier Curve */ 849 /*----------------------------------------------------------------------*/ 850 851 typedef struct { 852 u_short type; 853 int color; 854 eparamptr passed; /* numerical parameters passed from above */ 855 u_short style; 856 float width; 857 pointselect *cycle; /* Edit position(s), or NULL */ 858 XPoint ctrl[4]; 859 /* the following are for rendering only */ 860 XfPoint points[INTSEGS]; 861 } spline, *splineptr; 862 863 /*----------------------------------------------------------------------*/ 864 /* Arc */ 865 /*----------------------------------------------------------------------*/ 866 867 typedef struct { 868 u_short type; 869 int color; 870 eparamptr passed; /* numerical parameters passed from above */ 871 u_short style; 872 float width; 873 pointselect *cycle; /* Edit position(s), or NULL */ 874 short radius; /* x-axis radius */ 875 short yaxis; /* y-axis radius */ 876 float angle1; /* endpoint angles, in degrees */ 877 float angle2; 878 XPoint position; 879 /* the following are for rendering only */ 880 short number; 881 XfPoint points[RSTEPS + 1]; 882 } arc, *arcptr; 883 884 /*----------------------------------------------------------------------*/ 885 /* Path */ 886 /*----------------------------------------------------------------------*/ 887 888 typedef struct { 889 u_short type; 890 int color; 891 eparamptr passed; /* numerical parameters passed from above */ 892 u_short style; 893 float width; 894 short parts; 895 genericptr *plist; /* to be retypecast to polygon, arc, or spline */ 896 } path, *pathptr; 897 898 /*----------------------------------------------------------------------*/ 899 /* selection from top-level object */ 900 /*----------------------------------------------------------------------*/ 901 902 /*----------------------------------------------------------------------*/ 903 /* Undo mechanism definitions */ 904 /*----------------------------------------------------------------------*/ 905 906 enum UNDO_MODES {UNDO_DONE = 0, UNDO_MORE, MODE_CONNECT, MODE_RECURSE_WIDE, 907 MODE_RECURSE_NARROW}; 908 909 typedef struct _selection *selectionptr; 910 911 typedef struct _selection { 912 int selects; 913 short *selectlist; 914 objinstptr thisinst; 915 selectionptr next; 916 } selection; 917 918 #define select_element(a) recurse_select_element(a, UNDO_MORE) 919 #define select_add_element(a) recurse_select_element(a, UNDO_DONE) 920 921 #define easydraw(a, b) geneasydraw(a, b, topobject, areawin->topinstance) 922 923 /*----------------------------------------------------------------------*/ 924 /* Netlist structures for schematic capture */ 925 /*----------------------------------------------------------------------*/ 926 927 /* Structure to hold net and subnet IDs for a bus */ 928 929 typedef struct { 930 int netid; 931 int subnetid; 932 } buslist; 933 934 /* Structure mimicking the top part of a Polylist or Labellist */ 935 /* when we just want the netlist information and don't care */ 936 /* which one we're looking at. */ 937 938 typedef struct { 939 union { 940 int id; 941 buslist *list; 942 } net; 943 int subnets; 944 } Genericlist; 945 946 /* Linked polygon list */ 947 948 typedef struct _Polylist *PolylistPtr; 949 typedef struct _Polylist 950 { 951 union { 952 int id; /* A single net ID, if subnets == 0 */ 953 buslist *list; /* List of net and subnet IDs for a bus */ 954 } net; 955 int subnets; /* Number of subnets; 0 if no subnets */ 956 objectptr cschem; /* Schematic containing the polygon */ 957 polyptr poly; 958 PolylistPtr next; /* Next polygon in the linked list */ 959 } Polylist; 960 961 /* Linked label list */ 962 963 typedef struct _Labellist *LabellistPtr; 964 typedef struct _Labellist 965 { 966 union { 967 int id; /* A single net ID, if subnets == 0 */ 968 buslist *list; /* List of net and subnet IDs for a bus */ 969 } net; 970 int subnets; /* Number of subnets; 0 if no subnets */ 971 objectptr cschem; /* Schematic containing the label */ 972 objinstptr cinst; /* Specific label instance, if applicable */ 973 labelptr label; 974 LabellistPtr next; 975 } Labellist; 976 977 /* List of object's networks by (flattened) name */ 978 979 typedef struct _Netname *NetnamePtr; 980 typedef struct _Netname 981 { 982 int netid; 983 stringpart *localpin; 984 NetnamePtr next; 985 } Netname; 986 987 /* List of object's I/O ports */ 988 989 typedef struct _Portlist *PortlistPtr; 990 typedef struct _Portlist 991 { 992 int portid; 993 int netid; 994 PortlistPtr next; 995 } Portlist; 996 997 /* List of calls to instances of objects */ 998 /* or subcircuit objects. */ 999 1000 typedef struct _Calllist *CalllistPtr; 1001 typedef struct _Calllist 1002 { 1003 objectptr cschem; /* Schematic containing the instance called */ 1004 objinstptr callinst; /* Instance called */ 1005 objectptr callobj; /* Object of instance called */ 1006 char *devname; /* if non-null, name of device in netlist */ 1007 int devindex; /* if non-negative, index of device in netlist */ 1008 PortlistPtr ports; 1009 CalllistPtr next; 1010 } Calllist; 1011 1012 /* PCB netlist structures */ 1013 1014 struct Pnet { 1015 int numnets; 1016 int *netidx; 1017 struct Pnet *next; 1018 }; 1019 1020 struct Pstr { 1021 stringpart *string; 1022 struct Pstr *next; 1023 }; 1024 1025 struct Ptab { 1026 objectptr cschem; 1027 struct Pnet *nets; 1028 struct Pstr *pins; 1029 struct Ptab *next; 1030 }; 1031 1032 /*----------------------------------------------------------------------*/ 1033 /* Information needed to highlight a net */ 1034 /*----------------------------------------------------------------------*/ 1035 1036 typedef struct { 1037 Genericlist *netlist; 1038 objinstptr thisinst; 1039 } Highlight; 1040 1041 /*----------------------------------------------------------------------*/ 1042 /* Main object structure */ 1043 /*----------------------------------------------------------------------*/ 1044 1045 typedef struct _xcobject { 1046 char name[80]; 1047 u_short changes; /* Number of unsaved changes to object */ 1048 Boolean hidden; 1049 float viewscale; 1050 XPoint pcorner; /* position relative to window */ 1051 BBox bbox; /* bounding box information (excluding */ 1052 /* parameterized elements) */ 1053 short parts; 1054 genericptr *plist; /* to be retypecast to label, polygon, etc. */ 1055 oparamptr params; /* list of parameters, with default values */ 1056 1057 Highlight highlight; /* net to be highlighted on redraw */ 1058 u_char schemtype; 1059 objectptr symschem; /* schematic page support */ 1060 Boolean valid; /* Is current netlist valid? */ 1061 Boolean traversed; /* Flag to indicate object was processed */ 1062 LabellistPtr labels; /* Netlist pins */ 1063 PolylistPtr polygons; /* Netlist wires */ 1064 PortlistPtr ports; /* Netlist ports */ 1065 CalllistPtr calls; /* Netlist subcircuits and connections */ 1066 Boolean infolabels; /* TRUE if object contains info-labels */ 1067 NetnamePtr netnames; /* Local names for flattening */ 1068 /* (this probably shouldn't be here. . .) */ 1069 } object; 1070 1071 /*----------------------------------------------------------------------*/ 1072 /* Transformation matrices */ 1073 /* Works like this (see also PostScript reference manual): */ 1074 /* [x' y' 1] = [x y 1] * | a d 0 | */ 1075 /* | b e 0 | */ 1076 /* | c f 1 | */ 1077 /*----------------------------------------------------------------------*/ 1078 1079 typedef struct _matrix *Matrixptr; 1080 1081 typedef struct _matrix { 1082 float a, b, c, d, e, f; 1083 Matrixptr nextmatrix; 1084 } Matrix; 1085 1086 /*----------------------------------------------------------------------*/ 1087 /* Some convenience functions for matrix manipulation */ 1088 /*----------------------------------------------------------------------*/ 1089 1090 #define DCTM areawin->MatStack 1091 1092 /*----------------------------------------------------------------------*/ 1093 /* button tap/press definitions */ 1094 /*----------------------------------------------------------------------*/ 1095 1096 #define PRESSTIME 200 /* milliseconds of push to be a "press" */ 1097 1098 /*----------------------------------------------------------------------*/ 1099 /* object name alias structures */ 1100 /*----------------------------------------------------------------------*/ 1101 1102 typedef struct _stringlist *slistptr; 1103 1104 typedef struct _stringlist { 1105 char *alias; 1106 slistptr next; 1107 } stringlist; 1108 1109 typedef struct _alias *aliasptr; 1110 1111 typedef struct _alias { 1112 objectptr baseobj; /* pointer to object (actual name) */ 1113 slistptr aliases; /* linked list of alias names */ 1114 aliasptr next; 1115 } alias; 1116 1117 /*----------------------------------------------------------------------*/ 1118 /* To facilitate compiling the Tcl/Tk version, we make some convenient */ 1119 /* definitions for types "xc..." and "Xc..." which can be mapped both */ 1120 /* to X and Xt or to Tk functions and types. */ 1121 /*----------------------------------------------------------------------*/ 1122 1123 #ifdef TCL_WRAPPER 1124 1125 #define xcWidget Tk_Window 1126 #define xcWidgetList Tk_Window * 1127 #define xcAddEventHandler(a,b,c,d,e) Tk_CreateEventHandler(a,b,d,e) 1128 #define xcRemoveEventHandler(a,b,c,d,e) Tk_DeleteEventHandler(a,b,d,e) 1129 #define xcEventHandler Tk_EventProc * 1130 #define xcWindow Tk_WindowId 1131 #define xcIsRealized Tk_IsMapped /* not sure this is right */ 1132 #define xcScreen Tk_Screen 1133 #define xcParent Tk_Parent 1134 #define xcDispatchEvent(a) Tk_HandleEvent(a) 1135 #define xcAddTimeOut(a, b, c, d) Tcl_CreateTimerHandler((int)(b), c, d) 1136 #define xcRemoveTimeOut Tcl_DeleteTimerHandler 1137 #define xcTimeOutProc Tcl_TimerProc * 1138 #define xcIntervalId Tcl_TimerToken 1139 1140 #else 1141 1142 #define xcWidget Widget 1143 #define xcWidgetList WidgetList 1144 #define xcAddEventHandler XtAddEventHandler 1145 #define xcRemoveEventHandler XtRemoveEventHandler 1146 #define xcEventHandler XtEventHandler 1147 #define xcWindow XtWindow 1148 #define xcIsRealized XtIsRealized 1149 #define xcScreen XtScreen 1150 #define xcParent XtParent 1151 #define xcDispatchEvent(a) XtDispatchEvent(a) 1152 #define xcAddTimeOut XtAppAddTimeOut 1153 #define xcRemoveTimeOut XtRemoveTimeOut 1154 #define xcTimeOutProc XtTimerCallbackProc 1155 #define xcIntervalId XtIntervalId 1156 #ifndef ClientData 1157 #define ClientData XtPointer 1158 #endif 1159 #endif 1160 1161 /*----------------------------------------------------------------------*/ 1162 /* structures for managing the popup prompt widgets */ 1163 /*----------------------------------------------------------------------*/ 1164 1165 typedef struct { 1166 xcWidget button; 1167 int foreground; 1168 void (*buttoncall)(); 1169 void *dataptr; 1170 } buttonsave; 1171 1172 typedef struct { 1173 xcWidget popup; /* Popup widget */ 1174 xcWidget textw; /* Text entry widget */ 1175 xcWidget filew; /* File list window */ 1176 xcWidget scroll; /* Scrollbar widget */ 1177 void (*setvalue)(); /* Callback function */ 1178 buttonsave *buttonptr; /* Button widget calling popup */ 1179 char *filter; /* Extension filter for highlighting */ 1180 /* files. NULL for no file window. */ 1181 /* NULL-string for no highlights. */ 1182 } popupstruct; 1183 1184 typedef struct { 1185 xcWidget textw; 1186 xcWidget buttonw; 1187 void (*setvalue)(); 1188 void *dataptr; 1189 } propstruct; 1190 1191 typedef struct { 1192 char *filename; 1193 int filetype; 1194 } fileliststruct; 1195 1196 enum {DIRECTORY = 0, MATCH, NONMATCH}; /* file types */ 1197 1198 /*----------------------------------------------------------------------*/ 1199 /* Initial Resource Management */ 1200 /*----------------------------------------------------------------------*/ 1201 1202 typedef struct { 1203 /* schematic layout colors */ 1204 Pixel globalcolor, localcolor, infocolor, ratsnestcolor; 1205 1206 /* non-schematic layout color(s) */ 1207 Pixel fixedbboxpix, bboxpix, clipcolor; 1208 1209 /* color scheme 1 */ 1210 Pixel fg, bg; 1211 Pixel gridpix, snappix, selectpix, axespix; 1212 Pixel buttonpix, filterpix, auxpix, barpix, parampix; 1213 1214 /* color scheme 2 */ 1215 Pixel fg2, bg2; 1216 Pixel gridpix2, snappix2, selectpix2, axespix2; 1217 Pixel buttonpix2, auxpix2, parampix2; 1218 1219 int width, height, timeout; 1220 XFontStruct *filefont; 1221 1222 #ifndef TCL_WRAPPER 1223 XFontStruct *xcfont, *textfont, *titlefont, *helpfont; 1224 #endif 1225 1226 } ApplicationData, *ApplicationDataPtr; 1227 1228 /*----------------------------------------------------------------------*/ 1229 /* Macros for GC color and function handling */ 1230 /*----------------------------------------------------------------------*/ 1231 1232 #define XTopSetForeground(a) if (a == DEFAULTCOLOR) SetForeground(dpy, \ 1233 areawin->gc, FOREGROUND); else SetForeground(dpy, areawin->gc, a) 1234 1235 #define XcTopSetForeground(z) XTopSetForeground(z); areawin->gccolor = \ 1236 ((z) == DEFAULTCOLOR) ? FOREGROUND : (z) 1237 1238 #define XcSetForeground(z) SetForeground(dpy, areawin->gc, z); \ 1239 areawin->gccolor = z 1240 1241 /*----------------------------------------------------------------------*/ 1242 /* Structure for maintaining list of colors */ 1243 /*----------------------------------------------------------------------*/ 1244 1245 typedef struct { 1246 xcWidget cbutton; 1247 XColor color; 1248 } colorindex; 1249 1250 /*----------------------------------------------------------------------*/ 1251 /* Font information structure */ 1252 /*----------------------------------------------------------------------*/ 1253 /* Flags: bit description */ 1254 /* 0 bold = 1, normal = 0 */ 1255 /* 1 italic = 1, normal = 0 */ 1256 /* 2 <reserved, possibly for narrow font type> */ 1257 /* 3 drawn = 1, PostScript = 0 */ 1258 /* 4 <reserved, possibly for LaTeX font type> */ 1259 /* 5 special encoding = 1, Standard Encoding = 0 */ 1260 /* 6 ISOLatin1 = 2, ISOLatin2 = 3 */ 1261 /* 7+ <reserved for other encoding schemes> */ 1262 /*----------------------------------------------------------------------*/ 1263 1264 typedef struct { 1265 char *psname; 1266 char *family; 1267 float scale; 1268 u_short flags; 1269 objectptr *encoding; 1270 #ifdef HAVE_CAIRO 1271 const char **utf8encoding; 1272 cairo_font_face_t *font_face; 1273 unsigned long glyph_index[256]; 1274 double glyph_top[256]; 1275 double glyph_bottom[256]; 1276 double glyph_advance[256]; 1277 #endif /* HAVE_CAIRO */ 1278 } fontinfo; 1279 1280 /*----------------------------------------------------------------------*/ 1281 1282 typedef struct { 1283 char *name; 1284 BBox bbox; 1285 } psbkground; 1286 1287 /*----------------------------------------------------------------------*/ 1288 /* Key macro information */ 1289 /*----------------------------------------------------------------------*/ 1290 1291 typedef struct _keybinding *keybindingptr; 1292 1293 typedef struct _keybinding { 1294 xcWidget window; /* per-window function, or NULL */ 1295 int keywstate; 1296 int function; 1297 short value; 1298 keybindingptr nextbinding; 1299 } keybinding; 1300 1301 /*----------------------------------------------------------------------*/ 1302 /* Enumeration of functions available for binding to keys/buttons */ 1303 /* IMPORTANT! Do not alter this list without also fixing the text */ 1304 /* in keybindings.c! */ 1305 /*----------------------------------------------------------------------*/ 1306 1307 enum { 1308 XCF_ENDDATA = -2, XCF_SPACER /* -1 */, 1309 XCF_Page /* 0 */, XCF_Anchor /* 1 */, 1310 XCF_Superscript /* 2 */, XCF_Subscript /* 3 */, 1311 XCF_Normalscript /* 4 */, XCF_Font /* 5 */, 1312 XCF_Boldfont /* 6 */, XCF_Italicfont /* 7 */, 1313 XCF_Normalfont /* 8 */, XCF_Underline /* 9 */, 1314 XCF_Overline /* 10 */, XCF_ISO_Encoding /* 11 */, 1315 XCF_Halfspace /* 12 */, XCF_Quarterspace /* 13 */, 1316 XCF_Special /* 14 */, XCF_TabStop /* 15 */, 1317 XCF_TabForward /* 16 */, XCF_TabBackward /* 17 */, 1318 XCF_Text_Return /* 18 */, XCF_Text_Delete /* 19 */, 1319 XCF_Text_Right /* 20 */, XCF_Text_Left /* 21 */, 1320 XCF_Text_Up /* 22 */, XCF_Text_Down /* 23 */, 1321 XCF_Text_Split /* 24 */, XCF_Text_Home /* 25 */, 1322 XCF_Text_End /* 26 */, XCF_Linebreak /* 27 */, 1323 XCF_Parameter /* 28 */, XCF_Edit_Param /* 29 */, 1324 XCF_ChangeStyle /* 30 */, XCF_Edit_Delete /* 31 */, 1325 XCF_Edit_Insert /* 32 */, XCF_Edit_Append /* 33 */, 1326 XCF_Edit_Next /* 34 */, XCF_Attach /* 35 */, 1327 XCF_Next_Library /* 36 */, XCF_Library_Directory /* 37 */, 1328 XCF_Library_Move /* 38 */, XCF_Library_Copy /* 39 */, 1329 XCF_Library_Edit /* 40 */, XCF_Library_Delete /* 41 */, 1330 XCF_Library_Duplicate /* 42 */, XCF_Library_Hide /* 43 */, 1331 XCF_Library_Virtual /* 44 */, XCF_Page_Directory /* 45 */, 1332 XCF_Library_Pop /* 46 */, XCF_Virtual /* 47 */, 1333 XCF_Help /* 48 */, XCF_Redraw /* 49 */, 1334 XCF_View /* 50 */, XCF_Zoom_In /* 51 */, 1335 XCF_Zoom_Out /* 52 */, XCF_Pan /* 53 */, 1336 XCF_Double_Snap /* 54 */, XCF_Halve_Snap /* 55 */, 1337 XCF_Write /* 56 */, XCF_Rotate /* 57 */, 1338 XCF_Flip_X /* 58 */, XCF_Flip_Y /* 59 */, 1339 XCF_Snap /* 60 */, XCF_SnapTo /* 61 */, 1340 XCF_Pop /* 62 */, XCF_Push /* 63 */, 1341 XCF_Delete /* 64 */, XCF_Select /* 65 */, 1342 XCF_Box /* 66 */, XCF_Arc /* 67 */, 1343 XCF_Text /* 68 */, XCF_Exchange /* 69 */, 1344 XCF_Copy /* 70 */, XCF_Move /* 71 */, 1345 XCF_Join /* 72 */, XCF_Unjoin /* 73 */, 1346 XCF_Spline /* 74 */, XCF_Edit /* 75 */, 1347 XCF_Undo /* 76 */, XCF_Redo /* 77 */, 1348 XCF_Select_Save /* 78 */, XCF_Unselect /* 79 */, 1349 XCF_Dashed /* 80 */, XCF_Dotted /* 81 */, 1350 XCF_Solid /* 82 */, XCF_Prompt /* 83 */, 1351 XCF_Dot /* 84 */, XCF_Wire /* 85 */, 1352 XCF_Cancel /* 86 */, XCF_Nothing /* 87 */, 1353 XCF_Exit /* 88 */, XCF_Netlist /* 89 */, 1354 XCF_Swap /* 90 */, XCF_Pin_Label /* 91 */, 1355 XCF_Pin_Global /* 92 */, XCF_Info_Label /* 93 */, 1356 XCF_Graphic /* 94 */, XCF_SelectBox /* 95 */, 1357 XCF_Connectivity /* 96 */, XCF_Continue_Element /* 97 */, 1358 XCF_Finish_Element /* 98 */, XCF_Continue_Copy /* 99 */, 1359 XCF_Finish_Copy /* 100 */, XCF_Finish /* 101 */, 1360 XCF_Cancel_Last /* 102 */, XCF_Sim /* 103 */, 1361 XCF_SPICE /* 104 */, XCF_PCB /* 105 */, 1362 XCF_SPICEflat /* 106 */, XCF_Rescale /* 107 */, 1363 XCF_Reorder /* 108 */, XCF_Color /* 109 */, 1364 XCF_Margin_Stop /* 110 */, XCF_Text_Delete_Param /* 111 */, 1365 NUM_FUNCTIONS 1366 }; 1367 1368 /*----------------------------------------------------------------------*/ 1369 /* Per-drawing-page parameters */ 1370 /*----------------------------------------------------------------------*/ 1371 1372 typedef struct { 1373 /* per-drawing-page parameters */ 1374 objinstptr pageinst; 1375 char *filename; /* file to save as */ 1376 u_char idx; /* page index */ 1377 psbkground background; /* background rendered file info */ 1378 float wirewidth; 1379 float outscale; 1380 float gridspace; 1381 float snapspace; 1382 short orient; 1383 short pmode; 1384 short coordstyle; 1385 XPoint drawingscale; 1386 XPoint pagesize; /* size of page to print on */ 1387 XPoint margins; 1388 } Pagedata; 1389 1390 /*----------------------------------------------------------------------*/ 1391 /* Structure holding information about graphic images used. These hold */ 1392 /* the original data for the images, and may be shared. */ 1393 /*----------------------------------------------------------------------*/ 1394 1395 typedef struct { 1396 xcImage *image; 1397 int refcount; 1398 char *filename; 1399 } Imagedata; 1400 1401 /*----------------------------------------------------------------------*/ 1402 /* The main globally-accessible data structure. This structure holds */ 1403 /* all the critical data needed by the drawing window */ 1404 /*----------------------------------------------------------------------*/ 1405 1406 typedef struct _windowdata *XCWindowDataPtr; 1407 1408 typedef struct _windowdata { 1409 1410 XCWindowDataPtr next; /* next window in list */ 1411 1412 /* widgets and X11 parameters */ 1413 xcWidget area; 1414 xcWidget scrollbarh, scrollbarv; 1415 int panx, pany; 1416 Window window; 1417 GC gc; 1418 #ifndef HAVE_CAIRO 1419 Pixmap clipmask; 1420 Pixmap pbuf; /* clipmask buffer for hierarchical clipping */ 1421 signed char clipped; 1422 GC cmgc; 1423 #endif /* !HAVE_CAIRO */ 1424 int gccolor; 1425 xcIntervalId time_id; 1426 Boolean redraw_needed; 1427 Boolean redraw_ongoing; 1428 #ifdef HAVE_CAIRO 1429 cairo_surface_t *surface; 1430 cairo_t *cr; /* cairo_drawing context */ 1431 cairo_pattern_t *fixed_pixmap; /* pixmap holding the background data of */ 1432 /* all fixed element. ie. not including the */ 1433 /* element currently being edited. */ 1434 #else /* HAVE_CAIRO */ 1435 Pixmap fixed_pixmap; 1436 #endif /* HAVE_CAIRO */ 1437 /* global page parameters */ 1438 short width, height; 1439 short page; 1440 float vscale; /* proper scale */ 1441 XPoint pcorner; /* page position */ 1442 1443 /* global option defaults */ 1444 float textscale; 1445 float linewidth; 1446 float zoomfactor; 1447 short psfont; 1448 u_short anchor; 1449 u_short style; 1450 int color; 1451 short filter; /* selection filter */ 1452 Boolean manhatn; 1453 Boolean boxedit; 1454 Boolean pathedit; 1455 Boolean snapto; 1456 Boolean bboxon; 1457 Boolean center; 1458 Boolean gridon; 1459 Boolean axeson; 1460 Boolean invert; 1461 Boolean mapped; /* indicates if window is drawable */ 1462 char buschar; /* Character indicating vector notation */ 1463 Boolean editinplace; 1464 Boolean pinpointon; 1465 Boolean pinattach; /* keep wires attached to pins when moving objinsts */ 1466 Boolean showclipmasks; /* draw clipmask shape outlines */ 1467 #ifndef TCL_WRAPPER 1468 #ifdef HAVE_XPM 1469 Boolean toolbar_on; 1470 #endif 1471 #endif 1472 1473 /* buffers and associated variables */ 1474 XPoint save, origin; 1475 short selects; 1476 short *selectlist; 1477 short attachto; 1478 short lastlibrary; 1479 short textpos; 1480 short textend; 1481 objinstptr topinstance; 1482 objectptr editstack; 1483 Matrixptr MatStack; 1484 pushlistptr stack; 1485 pushlistptr hierstack; 1486 event_mode_t event_mode; 1487 char *lastbackground; 1488 Cursor *defaultcursor; 1489 } XCWindowData; 1490 1491 /* Record for undo function */ 1492 1493 typedef struct _undostack *Undoptr; 1494 1495 typedef struct _undostack { 1496 Undoptr next; /* next record in undo stack */ 1497 Undoptr last; /* double-linked for "redo" function */ 1498 u_int type; /* type of event */ 1499 short idx; /* counter for undo event */ 1500 objinstptr thisinst; /* instance of object in which event occurred */ 1501 XCWindowData *window;/* window in which event occurred */ 1502 int idata; /* simple undedicated integer datum */ 1503 char *undodata; /* free space to be malloc'd */ 1504 /* (size dependent on "type") */ 1505 } Undostack; 1506 1507 /* This whole thing needs to be cleaned up. . . now I've got objects in */ 1508 /* "library" which are repeated both in the "instlist" pair and the */ 1509 /* "thisobject" pointer in each instance. The instance is repeated on */ 1510 /* the library page. Ideally, the instance list should only exist on */ 1511 /* the library page, and not be destroyed on every call to "composelib" */ 1512 1513 typedef struct { 1514 short number; 1515 objectptr *library; 1516 liblistptr instlist; /* List of instances */ 1517 } Library; 1518 1519 typedef struct _Technology *TechPtr; 1520 1521 typedef struct _Technology { 1522 u_char flags; /* Flags for library page (changed, read-only) */ 1523 char *technology; /* Namespace name (without the "::") */ 1524 char *filename; /* Library file associated with technology */ 1525 TechPtr next; /* Linked list */ 1526 } Technology; 1527 1528 /* Known flags for library pages */ 1529 1530 #define TECH_CHANGED 0x01 1531 #define TECH_READONLY 0x02 /* Technology file not writable */ 1532 #define TECH_IMPORTED 0x04 /* Loaded only part of file */ 1533 #define TECH_REPLACE 0x08 /* Replace instances when reading */ 1534 #define TECH_REPLACE_TEMP 0x10 /* Temporary store */ 1535 #define TECH_USED 0x20 /* Temporary marker flag */ 1536 #define TECH_PREFER 0x40 /* Prefer technology on name conflict */ 1537 1538 /*----------------------------------------------------------------------*/ 1539 /* A convenient structure for holding all the object lists */ 1540 /*----------------------------------------------------------------------*/ 1541 1542 typedef struct { 1543 char *libsearchpath; /* list of directories to search */ 1544 char *filesearchpath; /* list of directories to search */ 1545 char *tempfile; 1546 char *tempdir; 1547 Boolean retain_backup; 1548 xcIntervalId timeout_id; 1549 int save_interval; 1550 Boolean filefilter; /* Is the file list filtered? */ 1551 Boolean hold; /* allow HOLD modifiers on buttons */ 1552 Boolean showtech; /* Write technology names in library */ 1553 u_short new_changes; 1554 signed char suspend; /* suspend graphics updates if TRUE */ 1555 short numlibs; 1556 short pages; 1557 Pagedata **pagelist; 1558 Undoptr undostack; /* actions to undo */ 1559 Undoptr redostack; /* actions to redo */ 1560 Library fontlib; 1561 Library *userlibs; 1562 TechPtr technologies; 1563 objinstptr *libtop; 1564 Imagedata *imagelist; 1565 short images; 1566 XCWindowData *windowlist; /* linked list of known windows */ 1567 } Globaldata; 1568 1569 1570 /*-------------------------------------------------------------------------*/ 1571 /* Track state of the ghostscript renderer */ 1572 /*-------------------------------------------------------------------------*/ 1573 1574 typedef enum { 1575 GS_INIT, /* Initial state; gs is idle. */ 1576 GS_PENDING, /* Drawing in progress; gs is busy. */ 1577 GS_READY /* Drawing done; gs is waiting for "next". */ 1578 } gs_state_t; 1579 1580 1581 /*-------------------------------------------------------------------------*/ 1582 /* For the eventmodes (ARC_MODE, EARC_MODE, SPLINE_MODE, etc) the drawing */ 1583 /* and/or redrawing of the elements is centralized in functions */ 1584 /* corresponding to the eventmode name (arc_mode_draw, spline_mode_draw, */ 1585 /* etc.). Depending on the state these functions clear, draw or whatever */ 1586 /* is needed. A description of the options follows below */ 1587 /* fixed_pixmap refers to the background pixmap without the element(s) */ 1588 /* currently being edited. */ 1589 /*-------------------------------------------------------------------------*/ 1590 1591 typedef enum { 1592 xcDRAW_INIT, /* Initalize fixed_pixmap and draw the element(s) */ 1593 /* element(s) currently being edited, including */ 1594 /* edit lines. */ 1595 1596 xcDRAW_EDIT, /* Draw the currently edited element(s), including */ 1597 /* edit lines. */ 1598 1599 xcDRAW_FINAL, /* Draw the finalized element(s), without edit */ 1600 /* lines to the fixed_pixmap */ 1601 1602 xcDRAW_EMPTY, /* Refresh the screen by drawing the fixed_pixmap */ 1603 /* This essentially clear the edited elements */ 1604 1605 xcREDRAW_FORCED /* Redraws everything, including edit lines. Only */ 1606 /* used in drawarea. This one should be called */ 1607 /* when something has changed (eg. zoom). */ 1608 /* It will redraw the fixed_pixmap */ 1609 } xcDrawType; 1610 1611 /*----------------------------------------------------------------------*/ 1612 /* structures previously defined in menudefs.h */ 1613 /*----------------------------------------------------------------------*/ 1614 /*----------------------------------------------------------------------*/ 1615 /* Menu Definitions for hierarchical pulldown menus */ 1616 /*----------------------------------------------------------------------*/ 1617 1618 #ifndef TCL_WRAPPER 1619 1620 typedef struct _menustruct *menuptr; 1621 1622 typedef struct _menustruct { 1623 char *name; 1624 menuptr submenu; 1625 short size; 1626 XtCallbackProc func; 1627 void *passeddata; 1628 } menustruct; 1629 1630 /*----------------------------------------------------------------------*/ 1631 /* Structure for calling routines from the Toolbar icons */ 1632 /*----------------------------------------------------------------------*/ 1633 1634 typedef struct _toolbarstruct *toolbarptr; 1635 1636 typedef struct _toolbarstruct { 1637 char *name; 1638 char **icon_data; 1639 XtCallbackProc func; 1640 void *passeddata; 1641 char *hint; 1642 } toolbarstruct; 1643 1644 #endif 1645 /* Menus and Toolbars are taken care of entirely by scripts in the Tcl/ */ 1646 /* Tk version of xcircuit. */ 1647 /*----------------------------------------------------------------------*/ 1648 1649