/alliance-5.0/graal/src/GMX_view.c

https://github.com/clothbot/Alliance-VLSI-CAD-System · C · 1026 lines · 717 code · 172 blank · 137 comment · 135 complexity · 0f1d98b72e89f45be53d86b7071d4423 MD5 · raw file

  1. /*------------------------------------------------------------\
  2. | |
  3. | This file is part of the Alliance CAD System Copyright |
  4. | (C) Laboratoire LIP6 - Département ASIM Universite P&M Curie|
  5. | |
  6. | Home page : http://www-asim.lip6.fr/alliance/ |
  7. | E-mail : mailto:alliance-users@asim.lip6.fr |
  8. | |
  9. | This progam is free software; you can redistribute it |
  10. | and/or modify it under the terms of the GNU General Public |
  11. | License as published by the Free Software Foundation; |
  12. | either version 2 of the License, or (at your option) any |
  13. | later version. |
  14. | |
  15. | Alliance VLSI CAD System is distributed in the hope that |
  16. | it will be useful, but WITHOUT ANY WARRANTY; |
  17. | without even the implied warranty of MERCHANTABILITY or |
  18. | FITNESS FOR A PARTICULAR PURPOSE. See the GNU General |
  19. | Public License for more details. |
  20. | |
  21. | You should have received a copy of the GNU General Public |
  22. | License along with the GNU C Library; see the file COPYING. |
  23. | If not, write to the Free Software Foundation, Inc., |
  24. | 675 Mass Ave, Cambridge, MA 02139, USA. |
  25. | |
  26. \------------------------------------------------------------*/
  27. /*------------------------------------------------------------\
  28. | |
  29. | Tool : GRAAL |
  30. | |
  31. | File : View.c |
  32. | |
  33. | Author : Jacomme Ludovic |
  34. | |
  35. | Date : 28.03.95 |
  36. | |
  37. \------------------------------------------------------------*/
  38. /*------------------------------------------------------------\
  39. | |
  40. | Include Files |
  41. | |
  42. \------------------------------------------------------------*/
  43. # include <stdio.h>
  44. # include <signal.h>
  45. # include <X11/X.h>
  46. # include <Xm/Xm.h>
  47. # include "mut.h"
  48. # include "mph.h"
  49. # include "rds.h"
  50. # include "rpr.h"
  51. # include "rfm.h"
  52. # include "GSB.h"
  53. # include "GRM.h"
  54. # include "GMX.h"
  55. # include "GMX_view.h"
  56. /*------------------------------------------------------------\
  57. | |
  58. | Constants |
  59. | |
  60. \------------------------------------------------------------*/
  61. /*------------------------------------------------------------\
  62. | |
  63. | Types |
  64. | |
  65. \------------------------------------------------------------*/
  66. /*------------------------------------------------------------\
  67. | |
  68. | Variables |
  69. | |
  70. \------------------------------------------------------------*/
  71. static long GraalGraphicX1;
  72. static long GraalGraphicX2;
  73. static long GraalGraphicY1;
  74. static long GraalGraphicY2;
  75. static XFontStruct *GraalTextFont;
  76. static GC GraalTextGC;
  77. static GC GraalDrawGC;
  78. static GC GraalFillGC;
  79. static graalview *GraalHeadView = (graalview *)NULL;
  80. static graalview *GraalHeadViewString = (graalview *)NULL;
  81. static char GraalInterrupt = 0;
  82. static char GraalCheckInt = 0;
  83. /*------------------------------------------------------------\
  84. | |
  85. | Functions |
  86. | |
  87. \------------------------------------------------------------*/
  88. /*------------------------------------------------------------\
  89. | |
  90. | Alloc Functions |
  91. | |
  92. \------------------------------------------------------------*/
  93. /*------------------------------------------------------------\
  94. | |
  95. | GraalAllocView |
  96. | |
  97. \------------------------------------------------------------*/
  98. graalview *GraalAllocView()
  99. {
  100. return((graalview *)rdsalloc(sizeof(graalview), 1));
  101. }
  102. /*------------------------------------------------------------\
  103. | |
  104. | Free Functions |
  105. | |
  106. \------------------------------------------------------------*/
  107. /*------------------------------------------------------------\
  108. | |
  109. | GraalFreeView |
  110. | |
  111. \------------------------------------------------------------*/
  112. void GraalFreeView( FreeView )
  113. graalview *FreeView;
  114. {
  115. rdsfree((char *)FreeView, sizeof(graalview));
  116. }
  117. /*------------------------------------------------------------\
  118. | |
  119. | GraalAddViewLater |
  120. | |
  121. \------------------------------------------------------------*/
  122. void GraalAddViewLater( Rectangle )
  123. rdsrec_list *Rectangle;
  124. {
  125. graalview *View;
  126. rdsbegin();
  127. View = GraalAllocView();
  128. View->RECTANGLE = Rectangle;
  129. View->NEXT = GraalHeadView;
  130. GraalHeadView = View;
  131. rdsend();
  132. }
  133. /*------------------------------------------------------------\
  134. | |
  135. | GraalAddViewString |
  136. | |
  137. \------------------------------------------------------------*/
  138. void GraalAddViewString( Rectangle )
  139. rdsrec_list *Rectangle;
  140. {
  141. graalview *View;
  142. rdsbegin();
  143. View = GraalAllocView();
  144. View->RECTANGLE = Rectangle;
  145. View->NEXT = GraalHeadViewString;
  146. GraalHeadViewString = View;
  147. rdsend();
  148. }
  149. /*------------------------------------------------------------\
  150. | |
  151. | GraalDelView |
  152. | |
  153. \------------------------------------------------------------*/
  154. void GraalDelView()
  155. {
  156. graalview *DelView;
  157. graalview *View;
  158. rdsbegin();
  159. View = GraalHeadView;
  160. GraalHeadView = (graalview *)NULL;
  161. while( View != (graalview *)NULL )
  162. {
  163. DelView = View;
  164. View = View->NEXT;
  165. GraalFreeView( DelView );
  166. }
  167. rdsend();
  168. }
  169. /*------------------------------------------------------------\
  170. | |
  171. | GraalDelViewString |
  172. | |
  173. \------------------------------------------------------------*/
  174. void GraalDelViewString()
  175. {
  176. graalview *DelView;
  177. graalview *View;
  178. rdsbegin();
  179. View = GraalHeadViewString;
  180. GraalHeadViewString = (graalview *)NULL;
  181. while( View != (graalview *)NULL )
  182. {
  183. DelView = View;
  184. View = View->NEXT;
  185. GraalFreeView( DelView );
  186. }
  187. rdsend();
  188. }
  189. /*------------------------------------------------------------\
  190. | |
  191. | GraalDisplayOneRectangle |
  192. | |
  193. \------------------------------------------------------------*/
  194. void GraalDisplayOneRectangle( Rec )
  195. rdsrec_list *Rec;
  196. {
  197. long X1r;
  198. long X2r;
  199. long Y1r;
  200. long Y2r;
  201. long DeltaX;
  202. long DeltaY;
  203. long Xcr;
  204. long Ycr;
  205. char DrawLine;
  206. char Tiny;
  207. char Small;
  208. char RdsLayer;
  209. rdsbegin();
  210. RdsLayer = GetRdsLayer( Rec );
  211. X1r = (float)( Rec->X ) * GraalLambdaGridStep;
  212. Y1r = (float)( Rec->Y ) * GraalLambdaGridStep;
  213. X2r = (float)( Rec->X + Rec->DX ) * GraalLambdaGridStep;
  214. Y2r = (float)( Rec->Y + Rec->DY ) * GraalLambdaGridStep;
  215. X1r = ( X1r / GRAAL_RDS_LAMBDA ) - GraalPixelGridX;
  216. X2r = ( X2r / GRAAL_RDS_LAMBDA ) - GraalPixelGridX;
  217. Y1r = ( Y1r / GRAAL_RDS_LAMBDA ) - GraalPixelGridY;
  218. Y2r = ( Y2r / GRAAL_RDS_LAMBDA ) - GraalPixelGridY;
  219. if ( ( X1r <= X2r ) &&
  220. ( Y1r <= Y2r ) )
  221. {
  222. DrawLine = 0;
  223. Tiny = 0;
  224. Small = 0;
  225. DeltaX = X2r - X1r;
  226. DeltaY = Y2r - Y1r;
  227. if ( ( DeltaX <= 1 ) ||
  228. ( DeltaY <= 1 ) ) Tiny = 1;
  229. else
  230. if ( GRAAL_FILL_MODE != GRAAL_FILL_MODE_FILL )
  231. {
  232. if ( ( DeltaX <= 4 ) ||
  233. ( DeltaY <= 4 ) )
  234. {
  235. if ( ( RdsLayer != RDS_NWELL ) &&
  236. ( RdsLayer != RDS_PWELL ) )
  237. {
  238. Small = ! GRAAL_FORCE_DISPLAY;
  239. }
  240. }
  241. }
  242. if ( Tiny )
  243. {
  244. if ( ( DeltaX <= 1 ) &&
  245. ( DeltaY <= 1 ) )
  246. {
  247. XDrawPoint( GraalGraphicDisplay,
  248. GraalGraphicPixmap,
  249. GraalDrawGC,
  250. X1r, GraalGraphicDy - Y1r );
  251. }
  252. else
  253. if ( DeltaX <= 1 )
  254. {
  255. Xcr = ( X1r + X2r ) >> 1;
  256. XDrawLine( GraalGraphicDisplay,
  257. GraalGraphicPixmap,
  258. GraalDrawGC,
  259. Xcr, GraalGraphicDy - Y1r,
  260. Xcr, GraalGraphicDy - Y2r );
  261. }
  262. else
  263. {
  264. Ycr = ( Y1r + Y2r ) >> 1;
  265. XDrawLine( GraalGraphicDisplay,
  266. GraalGraphicPixmap,
  267. GraalDrawGC,
  268. X1r, GraalGraphicDy - Ycr,
  269. X2r, GraalGraphicDy - Ycr );
  270. }
  271. }
  272. else
  273. {
  274. if ( ! Small )
  275. {
  276. if ( X1r < GraalGraphicX1 )
  277. {
  278. X1r = GraalGraphicX1; DrawLine |= GRAAL_WEST_MASK;
  279. }
  280. if ( X2r > GraalGraphicX2 )
  281. {
  282. X2r = GraalGraphicX2; DrawLine |= GRAAL_EAST_MASK;
  283. }
  284. if ( Y1r < GraalGraphicY1 )
  285. {
  286. Y1r = GraalGraphicY1; DrawLine |= GRAAL_SOUTH_MASK;
  287. }
  288. if ( Y2r > GraalGraphicY2 )
  289. {
  290. Y2r = GraalGraphicY2; DrawLine |= GRAAL_NORTH_MASK;
  291. }
  292. }
  293. if ( ( X1r <= X2r ) &&
  294. ( Y1r <= Y2r ) )
  295. {
  296. if ( ( X1r == X2r ) &&
  297. ( Y1r == Y2r ) )
  298. {
  299. X2r++;
  300. Y2r++;
  301. }
  302. if ( DrawLine == 0 )
  303. {
  304. XDrawRectangle( GraalGraphicDisplay,
  305. GraalGraphicPixmap,
  306. GraalDrawGC,
  307. X1r, GraalGraphicDy - Y2r,
  308. X2r - X1r,
  309. Y2r - Y1r );
  310. }
  311. else
  312. {
  313. if ( ( DrawLine & GRAAL_WEST_MASK ) == 0 )
  314. {
  315. XDrawLine( GraalGraphicDisplay,
  316. GraalGraphicPixmap,
  317. GraalDrawGC,
  318. X1r, GraalGraphicDy - Y2r,
  319. X1r, GraalGraphicDy - Y1r );
  320. }
  321. if ( ( DrawLine & GRAAL_EAST_MASK ) == 0 )
  322. {
  323. XDrawLine( GraalGraphicDisplay,
  324. GraalGraphicPixmap,
  325. GraalDrawGC,
  326. X2r, GraalGraphicDy - Y2r,
  327. X2r, GraalGraphicDy - Y1r );
  328. }
  329. if ( ( DrawLine & GRAAL_SOUTH_MASK ) == 0 )
  330. {
  331. XDrawLine( GraalGraphicDisplay,
  332. GraalGraphicPixmap,
  333. GraalDrawGC,
  334. X1r, GraalGraphicDy - Y1r,
  335. X2r, GraalGraphicDy - Y1r );
  336. }
  337. if ( ( DrawLine & GRAAL_NORTH_MASK ) == 0 )
  338. {
  339. XDrawLine( GraalGraphicDisplay,
  340. GraalGraphicPixmap,
  341. GraalDrawGC,
  342. X1r, GraalGraphicDy - Y2r,
  343. X2r, GraalGraphicDy - Y2r );
  344. }
  345. }
  346. if ( ( ! Small ) &&
  347. ( RdsLayer != RDS_ABOX ) &&
  348. ( GRAAL_FILL_MODE != GRAAL_FILL_MODE_OUTLINE ) )
  349. {
  350. if ( GRAAL_FILL_MODE == GRAAL_FILL_MODE_PATTERN )
  351. {
  352. XSetFillStyle( GraalGraphicDisplay,
  353. GraalFillGC,
  354. FillStippled );
  355. }
  356. else
  357. {
  358. XSetFillStyle( GraalGraphicDisplay,
  359. GraalFillGC,
  360. FillSolid );
  361. }
  362. XFillRectangle( GraalGraphicDisplay,
  363. GraalGraphicPixmap,
  364. GraalFillGC,
  365. X1r, GraalGraphicDy - Y2r,
  366. X2r - X1r,
  367. Y2r - Y1r );
  368. }
  369. }
  370. }
  371. if ( ( DrawLine != 0 ) ||
  372. ( Rec->NAME == NULL ) )
  373. {
  374. ClearGraalDrawText( Rec );
  375. }
  376. }
  377. else
  378. {
  379. ClearGraalDrawText( Rec );
  380. }
  381. rdsend();
  382. }
  383. /*------------------------------------------------------------\
  384. | |
  385. | GraalDisplayOneString |
  386. | |
  387. \------------------------------------------------------------*/
  388. void GraalDisplayOneString( Rec )
  389. rdsrec_list *Rec;
  390. {
  391. char *Name;
  392. phcon_list *PhCon;
  393. char Buffer[ 512 ];
  394. long X1r;
  395. long X2r;
  396. long Y1r;
  397. long Y2r;
  398. long WidthText;
  399. long HeightText;
  400. rdsbegin();
  401. X1r = (float)( Rec->X ) * GraalLambdaGridStep;
  402. Y1r = (float)( Rec->Y ) * GraalLambdaGridStep;
  403. X2r = (float)( Rec->X + Rec->DX ) * GraalLambdaGridStep;
  404. Y2r = (float)( Rec->Y + Rec->DY ) * GraalLambdaGridStep;
  405. X1r = ( X1r / GRAAL_RDS_LAMBDA ) - GraalPixelGridX;
  406. X2r = ( X2r / GRAAL_RDS_LAMBDA ) - GraalPixelGridX;
  407. Y1r = ( Y1r / GRAAL_RDS_LAMBDA ) - GraalPixelGridY;
  408. Y2r = ( Y2r / GRAAL_RDS_LAMBDA ) - GraalPixelGridY;
  409. if ( ( GRAAL_CONNECTOR_INDEX ) &&
  410. ( IsRdsFigRec( Rec ) ) &&
  411. ( IsRdsConnector( Rec ) ) )
  412. {
  413. PhCon = (phcon_list *)GRAAL_MBK( Rec );
  414. sprintf( Buffer, "%s.%ld", PhCon->NAME, PhCon->INDEX );
  415. Name = namealloc( Buffer );
  416. }
  417. else
  418. {
  419. Name = Rec->NAME;
  420. }
  421. HeightText = GraalTextFont->ascent;
  422. WidthText = XTextWidth( GraalTextFont,
  423. Name, strlen( Name ) );
  424. if ( GRAAL_BLACK_BOX_STRING )
  425. {
  426. XDrawImageString( GraalGraphicDisplay,
  427. GraalGraphicPixmap,
  428. GraalTextGC,
  429. (( X1r + X2r - WidthText ) >> 1),
  430. GraalGraphicDy - (( Y1r + Y2r - HeightText ) >> 1),
  431. Name, strlen( Name ) );
  432. }
  433. else
  434. {
  435. XDrawString( GraalGraphicDisplay,
  436. GraalGraphicPixmap,
  437. GraalTextGC,
  438. (( X1r + X2r - WidthText ) >> 1),
  439. GraalGraphicDy - (( Y1r + Y2r - HeightText ) >> 1),
  440. Name, strlen( Name ) );
  441. }
  442. ClearGraalDrawText( Rec );
  443. rdsend();
  444. }
  445. /*------------------------------------------------------------\
  446. | |
  447. | GraalCheckInterrupt |
  448. | |
  449. \------------------------------------------------------------*/
  450. char GraalCheckInterrupt()
  451. {
  452. XEvent Event;
  453. KeySym Key;
  454. char Text[ 2 ];
  455. rdsbegin();
  456. if ( GraalCheckInt )
  457. {
  458. if ( XCheckTypedEvent( GraalGraphicDisplay, KeyPress, &Event ) )
  459. {
  460. XLookupString( &Event.xkey, Text, 1, &Key, 0 );
  461. if ( Text[ 0 ] == '\003' )
  462. {
  463. GraalInterrupt = 1;
  464. XBell( GraalGraphicDisplay, 0 );
  465. }
  466. }
  467. }
  468. GraalCheckInt = 0;
  469. rdsend();
  470. return( GraalInterrupt );
  471. }
  472. /*------------------------------------------------------------\
  473. | |
  474. | GraalInterruptDisplay |
  475. | |
  476. \------------------------------------------------------------*/
  477. void GraalInterruptDisplay()
  478. {
  479. rdsbegin();
  480. GraalCheckInt = 1;
  481. signal( SIGALRM, GraalInterruptDisplay );
  482. alarm( 1 );
  483. rdsend();
  484. }
  485. /*------------------------------------------------------------\
  486. | |
  487. | GraalFlushEventDisplay |
  488. | |
  489. \------------------------------------------------------------*/
  490. void GraalFlushEventDisplay()
  491. {
  492. XEvent Event;
  493. rdsbegin();
  494. while ( XCheckTypedEvent( GraalGraphicDisplay, KeyPress, &Event ) );
  495. rdsend();
  496. }
  497. /*------------------------------------------------------------\
  498. | |
  499. | GraalDisplayFigure |
  500. | |
  501. \------------------------------------------------------------*/
  502. void GraalDisplayFigure( GraphicX1, GraphicY1, GraphicX2, GraphicY2 )
  503. long GraphicX1;
  504. long GraphicY1;
  505. long GraphicX2;
  506. long GraphicY2;
  507. {
  508. long Offset;
  509. graalwin *ScanWin;
  510. graalwinrec *ScanWinRec;
  511. rdsrec_list *Rec;
  512. rdsins_list *Instance;
  513. char ScanRec;
  514. char Layer;
  515. char StaticLayer;
  516. long X1;
  517. long Y1;
  518. long X2;
  519. long Y2;
  520. long X1r;
  521. long Y1r;
  522. long X;
  523. long Y;
  524. long Xmin;
  525. long Xmax;
  526. long Ymin;
  527. long Ymax;
  528. long LambdaMin;
  529. char DrawText;
  530. char DrawTextFig;
  531. char DrawTextFigCon;
  532. char DrawTextFigSeg;
  533. char DrawTextFigRef;
  534. char DrawTextIns;
  535. char DrawTextInsCon;
  536. char DrawTextInsSeg;
  537. char DrawTextInsRef;
  538. graalview *View;
  539. rdsbegin();
  540. GraalTextGC = GraalSmallTextGC;
  541. GraalTextFont = GraalSmallTextFont;
  542. DrawTextFig = 0;
  543. DrawTextFigCon = 0;
  544. DrawTextFigSeg = 0;
  545. DrawTextFigRef = 0;
  546. DrawTextIns = 0;
  547. DrawTextInsCon = 0;
  548. DrawTextInsSeg = 0;
  549. DrawTextInsRef = 0;
  550. GraalGraphicX1 = GraphicX1;
  551. GraalGraphicX2 = GraphicX2;
  552. GraalGraphicY1 = GraphicY1;
  553. GraalGraphicY2 = GraphicY2;
  554. if ( ( GraalLambdaGridStep > GRAAL_LOWER_FIGURE_STEP ) ||
  555. ( GRAAL_FORCE_DISPLAY ) )
  556. {
  557. DrawTextFig = GRAAL_RDS_ACTIVE_NAME_TABLE[ GRAAL_FIGURE_NAME ];
  558. }
  559. if ( ( GraalLambdaGridStep > GRAAL_LOWER_INSTANCE_STEP ) ||
  560. ( GRAAL_FORCE_DISPLAY ) )
  561. {
  562. DrawTextIns = GRAAL_RDS_ACTIVE_NAME_TABLE[ GRAAL_INSTANCE_NAME ];
  563. }
  564. if ( ( GraalLambdaGridStep > GRAAL_LOWER_CONNECTOR_STEP ) ||
  565. ( GRAAL_FORCE_DISPLAY ) )
  566. {
  567. DrawTextInsCon = GRAAL_RDS_ACTIVE_NAME_TABLE[ GRAAL_INSTANCE_CONNECTOR_NAME ];
  568. DrawTextFigCon = GRAAL_RDS_ACTIVE_NAME_TABLE[ GRAAL_FIGURE_CONNECTOR_NAME ];
  569. }
  570. if ( ( GraalLambdaGridStep > GRAAL_LOWER_SEGMENT_STEP ) ||
  571. ( GRAAL_FORCE_DISPLAY ) )
  572. {
  573. DrawTextFigSeg = GRAAL_RDS_ACTIVE_NAME_TABLE[ GRAAL_FIGURE_SEGMENT_NAME ];
  574. DrawTextInsSeg = GRAAL_RDS_ACTIVE_NAME_TABLE[ GRAAL_INSTANCE_SEGMENT_NAME ];
  575. }
  576. if ( ( GraalLambdaGridStep > GRAAL_LOWER_REFERENCE_STEP ) ||
  577. ( GRAAL_FORCE_DISPLAY ) )
  578. {
  579. DrawTextFigRef = GRAAL_RDS_ACTIVE_NAME_TABLE[ GRAAL_FIGURE_REFERENCE_NAME ];
  580. DrawTextInsRef = GRAAL_RDS_ACTIVE_NAME_TABLE[ GRAAL_INSTANCE_REFERENCE_NAME ];
  581. }
  582. if ( GraalLambdaGridStep > GRAAL_LOWER_CONNECTOR_STEP )
  583. {
  584. GraalTextGC = GraalMediumTextGC;
  585. GraalTextFont = GraalMediumTextFont;
  586. }
  587. if ( GraalLambdaGridStep > GRAAL_LOWER_REFERENCE_STEP )
  588. {
  589. GraalTextGC = GraalLargeTextGC;
  590. GraalTextFont = GraalLargeTextFont;
  591. }
  592. GraalClearGraphicWindow( GraphicX1,
  593. GraalGraphicDy - GraphicY2,
  594. GraphicX2 - GraphicX1,
  595. GraphicY2 - GraphicY1 );
  596. if ( GraalFigureMbk == (phfig_list *)NULL ) return;
  597. LambdaMin = (float)(4.0 / ( GraalLambdaGridStep ));
  598. X1 = GraphicX1 + GraalPixelGridX;
  599. X2 = GraphicX2 + GraalPixelGridX;
  600. Y1 = GraphicY1 + GraalPixelGridY;
  601. Y2 = GraphicY2 + GraalPixelGridY;
  602. X1 = ( X1 / GraalLambdaGridStep );
  603. Y1 = ( Y1 / GraalLambdaGridStep );
  604. X2 = ( X2 / GraalLambdaGridStep );
  605. Y2 = ( Y2 / GraalLambdaGridStep );
  606. if ( X2 >= 0 ) { X2 = X2 + 1; }
  607. if ( Y2 >= 0 ) { Y2 = Y2 + 1; }
  608. if ( X1 <= 0 ) { X1 = X1 - 1; }
  609. if ( Y1 <= 0 ) { Y1 = Y1 - 1; }
  610. X1 = X1 * GRAAL_RDS_LAMBDA;
  611. X2 = X2 * GRAAL_RDS_LAMBDA;
  612. Y1 = Y1 * GRAAL_RDS_LAMBDA;
  613. Y2 = Y2 * GRAAL_RDS_LAMBDA;
  614. Xmin = ( X1 - GraalWindowXmin ) / GraalWindowSide;
  615. Xmax = ( X2 - GraalWindowXmin ) / GraalWindowSide;
  616. Ymin = ( Y1 - GraalWindowYmin ) / GraalWindowSide;
  617. Ymax = ( Y2 - GraalWindowYmin ) / GraalWindowSide;
  618. if ( Xmin < 0 ) Xmin = 0;
  619. if ( Ymin < 0 ) Ymin = 0;
  620. if ( Xmin >= GraalWindowDx ) Xmin = GraalWindowDx - 1;
  621. if ( Ymin >= GraalWindowDy ) Ymin = GraalWindowDy - 1;
  622. if ( Xmax < 0 ) Xmax = 0;
  623. if ( Ymax < 0 ) Ymax = 0;
  624. if ( Xmax >= GraalWindowDx ) Xmax = GraalWindowDx - 1;
  625. if ( Ymax >= GraalWindowDy ) Ymax = GraalWindowDy - 1;
  626. GraalInterrupt = 0;
  627. GraalCheckInt = 0;
  628. signal( SIGALRM, GraalInterruptDisplay );
  629. alarm( 1 );
  630. for ( Layer = 0; Layer < RDS_MAX_LAYER; Layer++ )
  631. {
  632. if ( GraalCheckInterrupt() ) break;
  633. StaticLayer = RDS_STATIC_LAYER[ Layer ];
  634. if ( GRAAL_RDS_ACTIVE_LAYER_TABLE[ StaticLayer ] != 1 ) continue;
  635. Y = Ymin;
  636. while ( Y <= Ymax )
  637. {
  638. if ( GraalCheckInterrupt() ) break;
  639. X = Xmin;
  640. while ( X <= Xmax )
  641. {
  642. if ( GraalCheckInterrupt() ) break;
  643. Offset = Y * GraalWindowDx + X;
  644. ScanWin = &GraalWindowTable[ Offset ];
  645. if ( ScanWin->LAYERTAB != (graalwinrec **)NULL )
  646. {
  647. for ( ScanWinRec = ScanWin->LAYERTAB[ Layer ];
  648. ScanWinRec != (graalwinrec *)NULL;
  649. ScanWinRec = ScanWinRec->NEXT )
  650. {
  651. for ( ScanRec = 0; ScanRec < GRAAL_MAX_REC ; ScanRec++ )
  652. {
  653. Rec = ScanWinRec->RECTAB[ ScanRec ];
  654. if ( ( Rec != (rdsrec_list *)NULL ) &&
  655. ( ! IsGraalDeleted( Rec ) ) &&
  656. ( ! IsGraalInvisible( Rec ) ) &&
  657. ( Rec->X <= X2 ) &&
  658. ( Rec->Y <= Y2 ) &&
  659. ( ( Rec->X + Rec->DX ) >= X1 ) &&
  660. ( ( Rec->Y + Rec->DY ) >= Y1 ) )
  661. {
  662. if ( ( ! GRAAL_INSTANCE_INTERFACE ) &&
  663. ( ! IsRdsFigRec( Rec ) ) &&
  664. ( ! IsRdsInstance( Rec ) ) ) continue;
  665. if ( ( Rec->DX < LambdaMin ) &&
  666. ( Rec->DY < LambdaMin ) )
  667. {
  668. if ( ! GRAAL_FORCE_DISPLAY ) continue;
  669. }
  670. if ( ! IsGraalOneWindow( Rec ) )
  671. {
  672. X1r = ( Rec->X - GraalWindowXmin ) / GraalWindowSide;
  673. Y1r = ( Rec->Y - GraalWindowYmin ) / GraalWindowSide;
  674. if ( X1r < 0 ) X1r = 0;
  675. if ( Y1r < 0 ) Y1r = 0;
  676. if ( X1r >= GraalWindowDx ) X1r = GraalWindowDx - 1;
  677. if ( Y1r >= GraalWindowDy ) Y1r = GraalWindowDy - 1;
  678. if ( X1r < Xmin ) X1r = Xmin;
  679. if ( Y1r < Ymin ) Y1r = Ymin;
  680. if ( ( X1r != X ) || ( Y1r != Y ) )
  681. {
  682. if ( ! GRAAL_FORCE_DISPLAY ) continue;
  683. }
  684. }
  685. if ( ! IsRdsFigRec( Rec ) )
  686. {
  687. Instance = (rdsins_list *)GRAAL_PREVIOUS( Rec );
  688. if ( IsGraalDeleted( Instance->LAYERTAB[ RDS_ABOX ] ) ) continue;
  689. if ( IsRdsConnector( Rec ) )
  690. {
  691. DrawText = DrawTextInsCon;
  692. }
  693. else
  694. if ( ( IsRdsReference( Rec ) ) ||
  695. ( IsRdsVia( Rec ) ) )
  696. {
  697. DrawText = DrawTextInsRef;
  698. }
  699. else
  700. if ( IsRdsSegment( Rec ) )
  701. {
  702. DrawText = DrawTextInsSeg;
  703. }
  704. else
  705. {
  706. DrawText = DrawTextIns;
  707. }
  708. }
  709. else
  710. {
  711. if ( IsRdsConnector( Rec ) )
  712. {
  713. DrawText = DrawTextFigCon;
  714. }
  715. else
  716. if ( ( IsRdsReference( Rec ) ) ||
  717. ( IsRdsVia( Rec ) ) )
  718. {
  719. DrawText = DrawTextFigRef;
  720. }
  721. else
  722. if ( IsRdsSegment( Rec ) )
  723. {
  724. DrawText = DrawTextFigSeg;
  725. }
  726. else
  727. {
  728. DrawText = DrawTextFig;
  729. }
  730. }
  731. if ( DrawText ) SetGraalDrawText( Rec );
  732. if ( ( IsGraalAccepted( Rec ) != 0 ) ||
  733. ( IsGraalTreated( Rec ) != 0 ) ||
  734. ( IsGraalDruc( Rec ) != 0 ) )
  735. {
  736. GraalAddViewLater( Rec );
  737. }
  738. else
  739. {
  740. GraalDrawGC = GraalLayerDrawGC[ StaticLayer ];
  741. GraalFillGC = GraalLayerFillGC[ StaticLayer ];
  742. GraalDisplayOneRectangle( Rec );
  743. if ( IsGraalDrawText( Rec ) )
  744. {
  745. GraalAddViewString( Rec );
  746. }
  747. }
  748. }
  749. }
  750. }
  751. }
  752. X = X + 1;
  753. }
  754. Y = Y + 1;
  755. }
  756. for ( View = GraalHeadView;
  757. View != (graalview *)NULL;
  758. View = View->NEXT )
  759. {
  760. Rec = View->RECTANGLE;
  761. if ( IsGraalAccepted( Rec ) != 0 )
  762. {
  763. GraalDrawGC = GraalAcceptDrawGC;
  764. GraalFillGC = GraalLayerAcceptGC[ StaticLayer ];
  765. }
  766. else
  767. if ( IsGraalTreated( Rec ) != 0 )
  768. {
  769. GraalDrawGC = GraalEquiDrawGC;
  770. GraalFillGC = GraalLayerEquiGC[ StaticLayer ];
  771. }
  772. else
  773. {
  774. GraalDrawGC = GraalDrucDrawGC;
  775. GraalFillGC = GraalLayerDrucGC[ StaticLayer ];
  776. }
  777. GraalDisplayOneRectangle( Rec );
  778. }
  779. GraalDelView();
  780. }
  781. for ( View = GraalHeadViewString;
  782. View != (graalview *)NULL;
  783. View = View->NEXT )
  784. {
  785. Rec = View->RECTANGLE;
  786. GraalDisplayOneString( Rec );
  787. }
  788. GraalDelViewString();
  789. alarm( 0 );
  790. GraalFlushEventDisplay();
  791. rdsend();
  792. }
  793. /*------------------------------------------------------------\
  794. | |
  795. | GraalDisplayRectangle |
  796. | |
  797. \------------------------------------------------------------*/
  798. void GraalDisplayRectangle( Rectangle )
  799. rdsrec_list *Rectangle;
  800. {
  801. rdsrec_list *ScanRec;
  802. long Xmin;
  803. long Ymin;
  804. long Xmax;
  805. long Ymax;
  806. rdsbegin();
  807. Xmin = Rectangle->X;
  808. Ymin = Rectangle->Y;
  809. Xmax = Xmin + Rectangle->DX;
  810. Ymax = Ymin + Rectangle->DY;
  811. ScanRec = (rdsrec_list *)(Rectangle->USER);
  812. while ( ScanRec != Rectangle )
  813. {
  814. if ( Xmin > ScanRec->X )
  815. {
  816. Xmin = ScanRec->X;
  817. }
  818. if ( Xmax < ( ScanRec->X + ScanRec->DX ) )
  819. {
  820. Xmax = ScanRec->X + ScanRec->DX;
  821. }
  822. if ( Ymin > ScanRec->Y )
  823. {
  824. Ymin = ScanRec->Y;
  825. }
  826. if ( Ymax < ( ScanRec->Y + ScanRec->DY ) )
  827. {
  828. Ymax = ScanRec->Y + ScanRec->DY;
  829. }
  830. ScanRec = (rdsrec_list *)(ScanRec->USER);
  831. }
  832. Xmin = (float)( Xmin ) * GraalLambdaGridStep;
  833. Ymin = (float)( Ymin ) * GraalLambdaGridStep;
  834. Xmax = (float)( Xmax ) * GraalLambdaGridStep;
  835. Ymax = (float)( Ymax ) * GraalLambdaGridStep;
  836. Xmin = ( Xmin / GRAAL_RDS_LAMBDA ) - GraalPixelGridX - 1;
  837. Xmax = ( Xmax / GRAAL_RDS_LAMBDA ) - GraalPixelGridX + 1;
  838. Ymin = ( Ymin / GRAAL_RDS_LAMBDA ) - GraalPixelGridY - 1;
  839. Ymax = ( Ymax / GRAAL_RDS_LAMBDA ) - GraalPixelGridY + 1;
  840. if ( Xmin < 0 ) Xmin = 0;
  841. if ( Ymin < 0 ) Ymin = 0;
  842. if ( Xmax > GraalGraphicDx ) Xmax = GraalGraphicDx;
  843. if ( Ymax > GraalGraphicDy ) Ymax = GraalGraphicDy;
  844. if ( ( Xmax > 0 ) &&
  845. ( Ymax > 0 ) &&
  846. ( Xmin < GraalGraphicDx ) &&
  847. ( Ymin < GraalGraphicDy ) )
  848. {
  849. GraalDisplayFigure( Xmin, Ymin , Xmax, Ymax );
  850. GraalRefreshGraphicWindow( Xmin, GraalGraphicDy - Ymax,
  851. Xmax - Xmin, Ymax - Ymin );
  852. }
  853. rdsend();
  854. }