1 /*------------------------------------------------------------\
7 | Authors : Jacomme Ludovic |
10 \------------------------------------------------------------*/
28 static long XyagGraphicX1
;
29 static long XyagGraphicX2
;
30 static long XyagGraphicY1
;
31 static long XyagGraphicY2
;
32 static XFontStruct
*XyagTextFont
;
35 static char XyagInterrupt
= 0;
37 static xyagview_list
*XyagHeadView
= NULL
;
39 #define STOP_IN_LONG_SPACE(x) if (x<0) x=0; else if (x>16000) x=16000
41 /*------------------------------------------------------------\
43 \------------------------------------------------------------*/
50 view
= (xyagview_list
*)mbkalloc(sizeof(xyagview_list
));
56 /*------------------------------------------------------------\
58 \------------------------------------------------------------*/
61 XyagFreeView(FreeView
)
62 xyagview_list
*FreeView
;
67 /*------------------------------------------------------------\
69 \------------------------------------------------------------*/
77 View
= XyagAllocView();
80 View
->NEXT
= XyagHeadView
;
84 /*------------------------------------------------------------\
86 \------------------------------------------------------------*/
91 xyagview_list
*DelView
;
95 XyagHeadView
= (xyagview_list
*) NULL
;
97 while (View
!= (xyagview_list
*) NULL
) {
100 XyagFreeView(DelView
);
104 /*------------------------------------------------------------\
105 | XyagInterruptDisplay |
106 \------------------------------------------------------------*/
109 XyagInterruptDisplay()
115 signal(SIGALRM
, XyagInterruptDisplay
);
118 if (XCheckTypedEvent(XyagGraphicDisplay
, KeyPress
, &Event
)) {
119 XLookupString(&Event
.xkey
, &Text
, 1, &Key
, 0);
121 if (Text
== '\003') {
123 XBell(XyagGraphicDisplay
, 0);
128 /*------------------------------------------------------------\
129 | XyagFlushEventDisplay |
130 \------------------------------------------------------------*/
133 XyagFlushEventDisplay()
137 while (XCheckTypedEvent(XyagGraphicDisplay
, KeyPress
, &Event
));
140 /*------------------------------------------------------------\
141 | XyagComputeHexagon |
142 \------------------------------------------------------------*/
144 char XyagComputeHexagon(long long X1
, long long Y1
, long long X2
, long long Y2
, XPoint
*Points
)
149 StepY
= (Y2
- Y1
) >> 1;
152 if ((StepY
> 0) && (StepX
> 0)) {
153 Points
[0].x
= X1
+ StepX
;
156 Points
[1].y
= Y1
+ StepY
;
157 Points
[2].x
= X1
+ StepX
;
159 Points
[3].x
= X2
- StepX
;
162 Points
[4].y
= Y1
+ StepY
;
163 Points
[5].x
= X2
- StepX
;
165 Points
[6].x
= X1
+ StepX
;
174 /*------------------------------------------------------------\
176 \------------------------------------------------------------*/
178 char XyagComputeArrow(long long X1
, long long Y1
, long long X2
, long long Y2
, XPoint
*Points
)
188 LineX
= (float) (X2
- X1
);
189 LineY
= (float) (Y2
- Y1
);
191 if ((LineX
!= 0.0) || (LineY
!= 0.0)) {
192 Norm
= sqrt((LineX
* LineX
) + (LineY
* LineY
));
193 Norm
= Norm
/ XyagUnitGridStep
;
194 LineX
= LineX
/ Norm
;
195 LineY
= LineY
/ Norm
;
201 Points
[0].x
= X1
+ LineX
;
202 Points
[0].y
= Y1
+ LineY
;
203 Points
[1].x
= Points
[0].x
+ LineX
+ HalfX
+ CrossX
;
204 Points
[1].y
= Points
[0].y
+ LineY
+ HalfY
+ CrossY
;
205 Points
[2].x
= Points
[0].x
+ LineX
+ HalfX
- CrossX
;
206 Points
[2].y
= Points
[0].y
+ LineY
+ HalfY
- CrossY
;
214 /*------------------------------------------------------------\
215 | XyagDrawUserDefinedObject |
216 \------------------------------------------------------------*/
217 void XyagDrawUserDefinedObject(Obj
)
220 motif_draw
*ptm_draw
;
222 for(ptm_draw
=Obj
->SYMBOL
->MOTIF
->DRAW
;ptm_draw
;ptm_draw
=ptm_draw
->NEXT
)
225 long long X1r
, X2r
, Y1r
, Y2r
;
227 long long Xorigin
= Obj
->X
- Obj
->SYMBOL
->BOX
->X_MIN
;
228 long long Yorigin
= Obj
->Y
- Obj
->SYMBOL
->BOX
->Y_MIN
;
230 if(ptm_draw
->TYPE
== MOTIF_T_LINE
)
232 motif_line
*ptm_data
;
233 ptm_data
=ptm_draw
->DATA
.MLINE
;
235 X1r
= ( ( Xorigin
+ ptm_data
->START_X
) * XyagUnitGridStep
/ XYAG_UNIT
) - XyagPixelGridX
;
236 Y1r
= ( ( Yorigin
- ptm_data
->START_Y
) * XyagUnitGridStep
/ XYAG_UNIT
) - XyagPixelGridY
;
237 X2r
= ( ( Xorigin
+ ptm_data
->END_X
) * XyagUnitGridStep
/ XYAG_UNIT
) - XyagPixelGridX
;
238 Y2r
= ( ( Yorigin
- ptm_data
->END_Y
) * XyagUnitGridStep
/ XYAG_UNIT
) - XyagPixelGridY
;
240 XDrawLine(XyagGraphicDisplay
,
243 X1r
, XyagGraphicDy
- Y1r
,
244 X2r
, XyagGraphicDy
- Y2r
);
246 if(ptm_draw
->TYPE
== MOTIF_T_ARC
)
249 ptm_data
=ptm_draw
->DATA
.MARC
;
251 X1r
= ( ( Xorigin
+ ptm_data
->CORNER_X
) * XyagUnitGridStep
/ XYAG_UNIT
) - XyagPixelGridX
;
252 Y1r
= ( ( Yorigin
- ptm_data
->CORNER_Y
) * XyagUnitGridStep
/ XYAG_UNIT
) - XyagPixelGridY
;
253 X2r
= ptm_data
->R
* 2 * XyagUnitGridStep
/ XYAG_UNIT
;
255 XDrawArc(XyagGraphicDisplay
,
258 X1r
, XyagGraphicDy
- Y1r
,
266 /*------------------------------------------------------------\
267 | XyagDisplayOneObject |
268 \------------------------------------------------------------*/
271 XyagDisplayOneObject(Obj
)
281 long long DeltaY
, tmpy0
, tmpy1
;
283 if (IsXyagLineLeft(Obj
)) {
284 X1r
= Obj
->X
+ Obj
->DX
;
289 X2r
= Obj
->X
+ Obj
->DX
;
292 if (IsXyagLineDown(Obj
)) {
293 Y1r
= Obj
->Y
+ Obj
->DY
;
298 Y2r
= Obj
->Y
+ Obj
->DY
;
301 X1r
= (float) (X1r
) * XyagUnitGridStep
;
302 Y1r
= (float) (Y1r
) * XyagUnitGridStep
;
303 X2r
= (float) (X2r
) * XyagUnitGridStep
;
304 Y2r
= (float) (Y2r
) * XyagUnitGridStep
;
306 X1r
= (X1r
/ XYAG_UNIT
) - XyagPixelGridX
;
307 X2r
= (X2r
/ XYAG_UNIT
) - XyagPixelGridX
;
308 Y1r
= (Y1r
/ XYAG_UNIT
) - XyagPixelGridY
;
309 Y2r
= (Y2r
/ XYAG_UNIT
) - XyagPixelGridY
;
319 switch (GetXyagObjectType(Obj
)) {
320 case XYAG_OBJECT_LINE
:
321 tmpy0
=XyagGraphicDy
- Y1r
;
322 tmpy1
=XyagGraphicDy
- Y2r
;
323 /* printf("<%lld %lld> <%lld %lld> %ld\n",X1r,Y1r, X2r, Y2r, XyagGraphicDy);
324 printf("\t<%d %d> <%lld %lld>\n",(int)tmpy0,(int)tmpy1, tmpy0, tmpy1);
326 STOP_IN_LONG_SPACE(X1r
);
327 STOP_IN_LONG_SPACE(X2r
);
328 STOP_IN_LONG_SPACE(tmpy0
);
329 STOP_IN_LONG_SPACE(tmpy1
);
331 XDrawLine(XyagGraphicDisplay
,
338 case XYAG_OBJECT_ARROW
:
340 XDrawLine(XyagGraphicDisplay
,
343 X1r
, XyagGraphicDy
- Y1r
,
344 X2r
, XyagGraphicDy
- Y2r
);
346 if (XyagComputeArrow(X1r
, Y1r
, X2r
, Y2r
, Points
)) {
347 Points
[0].y
= XyagGraphicDy
- Points
[0].y
;
348 Points
[1].y
= XyagGraphicDy
- Points
[1].y
;
349 Points
[2].y
= XyagGraphicDy
- Points
[2].y
;
351 XFillPolygon(XyagGraphicDisplay
,
353 XyagDrawGC
, Points
, 3,
360 case XYAG_OBJECT_HEXAGON
:
362 if (XyagComputeHexagon(X1r
, Y1r
, X2r
, Y2r
, Points
)) {
363 for (Index
= 0; Index
< 7; Index
++) {
364 Points
[Index
].y
= XyagGraphicDy
- Points
[Index
].y
;
367 XDrawLines(XyagGraphicDisplay
,
369 XyagDrawGC
, Points
, 7,
375 case XYAG_OBJECT_CIRCLE
:
377 XDrawArc(XyagGraphicDisplay
,
380 X1r
, XyagGraphicDy
- Y2r
,
381 DeltaX
, DeltaY
, 0, 23040);
384 case XYAG_OBJECT_RECTANGLE
:
386 XDrawRectangle(XyagGraphicDisplay
,
389 X1r
, XyagGraphicDy
- Y2r
,
394 case XYAG_OBJECT_TRIANGLE
:
396 XDrawLine(XyagGraphicDisplay
,
399 X1r
, XyagGraphicDy
- Y1r
,
400 X2r
, (XyagGraphicDy
- Y1r
- (DeltaY
>> 1)));
402 XDrawLine(XyagGraphicDisplay
,
405 X1r
, XyagGraphicDy
- Y1r
,
406 X1r
, XyagGraphicDy
- Y2r
);
408 XDrawLine(XyagGraphicDisplay
,
411 X1r
, XyagGraphicDy
- Y2r
,
412 X2r
, (XyagGraphicDy
- Y1r
- (DeltaY
>> 1)));
416 case XYAG_OBJECT_SLIB
:
418 XyagDrawUserDefinedObject(Obj
);
422 case XYAG_OBJECT_CELL
:
424 XDrawRectangle(XyagGraphicDisplay
,
427 X1r
, XyagGraphicDy
- Y2r
,
434 /*------------------------------------------------------------\
435 | XyagDisplayOneString |
436 \------------------------------------------------------------*/
439 XyagDisplayOneString(Obj
)
449 long long HeightText
;
452 if (IsXyagLineLeft(Obj
)) {
453 X1r
= Obj
->X
+ Obj
->DX
;
458 X2r
= Obj
->X
+ Obj
->DX
;
461 if (IsXyagLineDown(Obj
)) {
462 Y1r
= Obj
->Y
+ Obj
->DY
;
467 Y2r
= Obj
->Y
+ Obj
->DY
;
470 X1r
= (float) (X1r
) * XyagUnitGridStep
;
471 Y1r
= (float) (Y1r
) * XyagUnitGridStep
;
472 X2r
= (float) (X2r
) * XyagUnitGridStep
;
473 Y2r
= (float) (Y2r
) * XyagUnitGridStep
;
475 X1r
= (X1r
/ XYAG_UNIT
) - XyagPixelGridX
;
476 X2r
= (X2r
/ XYAG_UNIT
) - XyagPixelGridX
;
477 Y1r
= (Y1r
/ XYAG_UNIT
) - XyagPixelGridY
;
478 Y2r
= (Y2r
/ XYAG_UNIT
) - XyagPixelGridY
;
488 Length
= strlen(Obj
->NAME
);
489 WidthText
= XTextWidth(XyagTextFont
, Obj
->NAME
, Length
);
490 HeightText
= XyagTextFont
->ascent
;
492 if (Obj
->TYPE
== XYAG_OBJECT_TEXT_RIGHT
) {
493 XDrawString(XyagGraphicDisplay
,
497 XyagGraphicDy
- ((Y1r
+ Y2r
- HeightText
) >> 1),
500 else if (Obj
->TYPE
== XYAG_OBJECT_TEXT_LEFT
) {
501 XDrawString(XyagGraphicDisplay
,
505 XyagGraphicDy
- ((Y1r
+ Y2r
- HeightText
) >> 1),
509 XDrawString(XyagGraphicDisplay
,
512 (X2r
+ X1r
- WidthText
) >> 1,
513 XyagGraphicDy
- ((Y1r
+ Y2r
- HeightText
) >> 1),
518 /*------------------------------------------------------------\
519 | XyagDisplayFigure |
520 \------------------------------------------------------------*/
523 XyagDisplayFigure(GraphicX1
, GraphicY1
, GraphicX2
, GraphicY2
)
537 extern int CGV_SCALE
;
541 XyagGraphicX1
= GraphicX1
;
542 XyagGraphicX2
= GraphicX2
;
543 XyagGraphicY1
= GraphicY1
;
544 XyagGraphicY2
= GraphicY2
;
546 if (XyagUnitGridStep
*CGV_SCALE
> 10.0) {
547 XyagTextGC
= XyagLargeTextGC
;
548 XyagTextFont
= XyagLargeTextFont
;
550 else if (XyagUnitGridStep
*CGV_SCALE
> 6.0) {
551 XyagTextGC
= XyagMediumTextGC
;
552 XyagTextFont
= XyagMediumTextFont
;
554 else if (XyagUnitGridStep
*CGV_SCALE
> 3.0) {
555 XyagTextGC
= XyagSmallTextGC
;
556 XyagTextFont
= XyagSmallTextFont
;
559 DisplayText
= XYAG_FORCE_DISPLAY
;
562 XyagClearGraphicWindow(GraphicX1
,
563 XyagGraphicDy
- GraphicY2
,
564 GraphicX2
- GraphicX1
,
565 GraphicY2
- GraphicY1
);
567 if (XyagFigure
== (xyagfig_list
*) NULL
)
570 X1
= GraphicX1
+ XyagPixelGridX
;
571 X2
= GraphicX2
+ XyagPixelGridX
;
572 Y1
= GraphicY1
+ XyagPixelGridY
;
573 Y2
= GraphicY2
+ XyagPixelGridY
;
575 // printf("gridstep=%g\n",XyagUnitGridStep);
576 X1
= (X1
/ XyagUnitGridStep
);
577 Y1
= (Y1
/ XyagUnitGridStep
);
578 X2
= (X2
/ XyagUnitGridStep
);
579 Y2
= (Y2
/ XyagUnitGridStep
);
601 signal(SIGALRM
, XyagInterruptDisplay
);
604 for (Layer
= 0; Layer
< XYAG_MAX_LAYER
; Layer
++) {
608 if (XYAG_ACTIVE_LAYER_TABLE
[Layer
] == 0)
611 XyagDrawGC
= XyagLayerDrawGC
[Layer
];
613 for (Obj
= XyagFigure
->OBJECT
[Layer
];
614 Obj
!= (xyagobj_list
*) NULL
;
619 if (XYAG_ACTIVE_LAYER_TABLE
[Obj
->LAYER
] == 0)
622 if ((Obj
->X
<= X2
) &&
624 (Obj
->X
+ Obj
->DX
>= X1
) &&
625 (Obj
->Y
+ Obj
->DY
>= Y1
)) {
626 if ((IsXyagAccept(Obj
)) ||
627 (IsXyagConnect(Obj
))) {
628 XyagAddViewLater(Obj
);
631 XyagDisplayOneObject(Obj
);
633 if (Obj
->NAME
!= (char *) 0) {
635 if (((IsXyagCgvCon(Obj
) &&
636 XYAG_ACTIVE_NAME_TABLE
[XYAG_CONNECTOR_NAME
])) ||
637 ((IsXyagCgvBox(Obj
) &&
638 XYAG_ACTIVE_NAME_TABLE
[XYAG_INSTANCE_NAME
]))) {
639 XyagDisplayOneString(Obj
);
648 for (View
= XyagHeadView
;
649 View
!= (xyagview_list
*) NULL
;
653 if (IsXyagAccept(Obj
)) {
654 XyagDrawGC
= XyagAcceptDrawGC
;
657 XyagDrawGC
= XyagConnectDrawGC
;
660 XyagDisplayOneObject(Obj
);
662 if (Obj
->NAME
!= (char *) 0) {
664 XyagDisplayOneString(Obj
);
672 XyagFlushEventDisplay();
675 /*------------------------------------------------------------\
676 | XyagDisplayObject |
677 \------------------------------------------------------------*/
680 XyagDisplayObject(Obj
)
683 xyagobj_list
*ScanObj
;
691 Xmax
= Xmin
+ Obj
->DX
;
692 Ymax
= Ymin
+ Obj
->DY
;
696 while (ScanObj
!= Obj
) {
697 if (Xmin
> ScanObj
->X
) {
701 if (Xmax
< (ScanObj
->X
+ ScanObj
->DX
)) {
702 Xmax
= ScanObj
->X
+ ScanObj
->DX
;
705 if (Ymin
> ScanObj
->Y
) {
709 if (Ymax
< (ScanObj
->Y
+ ScanObj
->DY
)) {
710 Ymax
= ScanObj
->Y
+ ScanObj
->DY
;
713 ScanObj
= ScanObj
->LINK
;
716 Xmin
= (float) (Xmin
- XYAG_UNIT
) * XyagUnitGridStep
;
717 Ymin
= (float) (Ymin
- XYAG_UNIT
) * XyagUnitGridStep
;
718 Xmax
= (float) (Xmax
+ XYAG_UNIT
) * XyagUnitGridStep
;
719 Ymax
= (float) (Ymax
+ XYAG_UNIT
) * XyagUnitGridStep
;
721 Xmin
= (Xmin
/ XYAG_UNIT
) - XyagPixelGridX
- 1;
722 Xmax
= (Xmax
/ XYAG_UNIT
) - XyagPixelGridX
+ 1;
723 Ymin
= (Ymin
/ XYAG_UNIT
) - XyagPixelGridY
- 1;
724 Ymax
= (Ymax
/ XYAG_UNIT
) - XyagPixelGridY
+ 1;
731 if (Xmax
> XyagGraphicDx
)
732 Xmax
= XyagGraphicDx
;
733 if (Ymax
> XyagGraphicDy
)
734 Ymax
= XyagGraphicDy
;
738 (Xmin
< XyagGraphicDx
) &&
739 (Ymin
< XyagGraphicDy
)) {
740 XyagDisplayFigure(Xmin
, Ymin
, Xmax
, Ymax
);
742 XyagRefreshGraphicWindow(Xmin
, XyagGraphicDy
- Ymax
,
743 Xmax
- Xmin
, Ymax
- Ymin
);