226
437
* all necessary sizes are already set by the porthole widget and
227
438
* by the event handlers
229
static void Redraw(Boolean ClearWindow)
441
Redraw (Boolean ClearWindow, BoxTypePtr screen_area)
231
/* make sure window exists */
232
if (Output.OutputWindow && (render || ClearWindow || !VALID_PIXMAP(Offscreen)))
234
/* shrink the update block */
235
Block.X1 = TO_SCREEN(PCB->MaxWidth);
236
Block.Y1 = TO_SCREEN(PCB->MaxHeight);
237
Block.X2 = Block.Y2 = 0;
239
/* switch off crosshair, set up drawing window and redraw
240
* everything with Gather = False
243
SwitchDrawingWindow(PCB->Zoom,
244
VALID_PIXMAP(Offscreen) ? Offscreen : Output.OutputWindow,
245
Settings.ShowSolderSide, False);
247
/* clear the background
248
* of the drawing area
250
XFillRectangle(Dpy, DrawingWindow, Output.bgGC, 0, 0,
251
TO_DRAWABS_X(PCB->MaxWidth),
252
TO_DRAWABS_Y(PCB->MaxHeight));
253
XSetForeground(Dpy, Output.fgGC, Settings.OffLimitColor);
254
XFillRectangle(Dpy, DrawingWindow, Output.fgGC,
255
TO_DRAWABS_X(PCB->MaxWidth), 0, MAX_COORD, MAX_COORD);
256
XFillRectangle(Dpy, DrawingWindow, Output.fgGC,
257
0, TO_DRAWABS_Y(PCB->MaxHeight), MAX_COORD, MAX_COORD);
259
Crosshair.On = False;
263
RestoreCrosshair(True);
444
Dimension pcbwidth, pcbheight;
446
/* make sure window exists */
447
if (Output.OutputWindow
448
&& (render || ClearWindow || !VALID_PIXMAP (Offscreen)))
450
/* shrink the update block */
451
Block.X1 = MAX_COORD / 100;
452
Block.Y1 = MAX_COORD / 100;
453
Block.X2 = Block.Y2 = 0;
455
/* switch off crosshair if needed,
456
* set up drawing window and redraw
457
* everything with Gather = False
459
if (!VALID_PIXMAP (Offscreen))
460
HideCrosshair (True);
461
SwitchDrawingWindow (PCB->Zoom,
462
VALID_PIXMAP (Offscreen) ? Offscreen :
463
Output.OutputWindow, Settings.ShowSolderSide,
465
draw_area.X1 = TO_PCB_X (screen_area->X1);
466
draw_area.X2 = TO_PCB_X (screen_area->X2);
468
MIN (TO_PCB_Y (screen_area->Y1), TO_PCB_Y (screen_area->Y2));
470
MAX (TO_PCB_Y (screen_area->Y1), TO_PCB_Y (screen_area->Y2));
472
/* clear the background
473
* of the drawing area
475
pcbwidth = TO_DRAWABS_X (PCB->MaxWidth);
476
pcbheight = TO_DRAWABS_Y (PCB->MaxHeight);
477
XFillRectangle (Dpy, DrawingWindow, Output.bgGC, 0, 0,
478
MIN (pcbwidth, Output.Width),
479
MIN (pcbheight, Output.Height));
480
XSetForeground (Dpy, Output.fgGC, Settings.OffLimitColor);
481
if (pcbwidth < Output.Width)
482
XFillRectangle (Dpy, DrawingWindow, Output.fgGC,
483
pcbwidth, 0, Output.Width - pcbwidth, Output.Height);
484
if (pcbheight < Output.Height)
485
XFillRectangle (Dpy, DrawingWindow, Output.fgGC, 0,
486
pcbheight, Output.Width, Output.Height - pcbheight);
487
if (ClearWindow && !VALID_PIXMAP (Offscreen))
488
Crosshair.On = False;
490
DrawBackgroundImage ();
491
DrawEverything (&draw_area);
493
if (!VALID_PIXMAP (Offscreen))
494
RestoreCrosshair (True);
269
500
/* ----------------------------------------------------------------------
270
501
* setup of zoom and output window for the next drawing operations
272
Boolean SwitchDrawingWindow(int Zoom, Window OutputWindow, Boolean Swap, Boolean Gather)
274
Boolean oldGather = Gathering;
278
DrawingWindow = OutputWindow;
279
if (OutputWindow == Offscreen || OutputWindow == Output.OutputWindow)
294
XSetFont(Dpy, Output.fgGC, Settings.PinoutFont[Zoom]->fid);
295
XSetFont(Dpy, Output.bgGC, Settings.PinoutFont[Zoom]->fid);
296
InitSpecialPolygon();
504
SwitchDrawingWindow (float Zoom, Window OutputWindow, Boolean Swap,
507
Boolean oldGather = Gathering;
510
Local_Zoom = 0.01 / expf (Zoom * LN_2_OVER_2);
515
ZoomValue = (int) Zoom;
516
DrawingWindow = OutputWindow;
517
if (OutputWindow == Offscreen || OutputWindow == Output.OutputWindow)
528
XSetFont (Dpy, Output.fgGC, Settings.PinoutFont[ZoomValue]->fid);
529
XSetFont (Dpy, Output.bgGC, Settings.PinoutFont[ZoomValue]->fid);
534
backE_callback (const BoxType * b, void *cl)
536
ElementTypePtr element = (ElementTypePtr) b;
538
if (!FRONT (element))
540
DrawElementPackage (element, 0);
546
backN_callback (const BoxType * b, void *cl)
548
TextTypePtr text = (TextTypePtr) b;
549
ElementTypePtr element = (ElementTypePtr) text->Element;
551
if (!FRONT (element) && !TEST_FLAG (HIDENAMEFLAG, element))
552
DrawElementName (element, 0);
557
backPad_callback (const BoxType * b, void *cl)
559
PadTypePtr pad = (PadTypePtr) b;
567
frontE_callback (const BoxType * b, void *cl)
569
ElementTypePtr element = (ElementTypePtr) b;
573
DrawElementPackage (element, 0);
579
EMark_callback (const BoxType * b, void *cl)
581
ElementTypePtr element = (ElementTypePtr) b;
583
DrawEMark (element->MarkX, element->MarkY, !FRONT (element));
588
frontN_callback (const BoxType * b, void *cl)
590
TextTypePtr text = (TextTypePtr) b;
591
ElementTypePtr element = (ElementTypePtr) text->Element;
593
if (FRONT (element) && !TEST_FLAG (HIDENAMEFLAG, element))
594
DrawElementName (element, 0);
599
hole_callback (const BoxType * b, void *cl)
601
DrawHole ((PinTypePtr) b);
606
rat_callback (const BoxType * b, void *cl)
608
DrawRat ((RatTypePtr) b, 0);
613
lowvia_callback (const BoxType * b, void *cl)
615
PinTypePtr via = (PinTypePtr) b;
617
DrawPlainVia (via, False);
300
621
/* ---------------------------------------------------------------------------
301
622
* initializes some identifiers for a new zoom factor and redraws whole screen
303
static void DrawEverything(void)
308
* first draw all 'invisible' stuff
310
if (PCB->InvisibleObjectsOn)
312
ELEMENT_LOOP(PCB->Data,
317
if (VELEMENT(element))
318
DrawElementPackage(element, 0);
319
if (VELTEXT(element))
320
DrawElementName(element, 0);
322
if (PCB->PinOn && VELEMENT(element))
323
PAD_LOOP(element, DrawPad(pad, 0));
327
DrawLayer(&PCB->Data->Layer[MAX_LAYER +
328
(SWAP_IDENT ? COMPONENT_LAYER : SOLDER_LAYER)], 0);
330
/* draw all layers in layerstack order */
331
for (i = MAX_LAYER-1; i >= 0; i--)
332
if ((LAYER_ON_STACK(i))->On)
333
DrawLayer(LAYER_ON_STACK(i), 0);
334
/* Draw pins, pads, vias */
336
/* Draw top silkscreen */
339
DrawLayer(&PCB->Data->Layer[MAX_LAYER +
340
(SWAP_IDENT ? SOLDER_LAYER : COMPONENT_LAYER)], 0);
341
ELEMENT_LOOP(PCB->Data,
344
if (VELEMENT(element))
345
DrawElementPackage(element, 0);
346
if (VELTEXT(element))
347
DrawElementName(element, 0);
350
if (PCB->PinOn && VELEMENT(element))
352
PIN_LOOP(element, DrawHole(pin));
353
DrawEMark(element->MarkX, element->MarkY,
360
ELEMENT_LOOP(PCB->Data,
361
if (VELEMENT(element))
362
PIN_LOOP(element, DrawHole(pin));
366
VIA_LOOP(PCB->Data, if (VVIA(via)) DrawHole(via));
367
/* Draw rat lines on top */
369
RAT_LOOP(PCB->Data, if (VLINE(line)) DrawRat(line, 0));
370
if (Settings.DrawGrid)
374
static void DrawEMark(Position X, Position Y, Boolean invisible)
376
if (!PCB->InvisibleObjectsOn && invisible)
378
XSetForeground(Dpy, Output.fgGC, invisible ? PCB->InvisibleMarkColor : PCB->ElementColor);
379
XSetLineAttributes(Dpy, Output.fgGC, 1, LineSolid, CapRound, JoinRound);
380
XDrawLine(Dpy, DrawingWindow, Output.fgGC, TO_DRAW_X(X - EMARK_SIZE),
381
TO_DRAW_Y(Y), TO_DRAW_X(X), TO_DRAW_Y(Y - EMARK_SIZE));
382
XDrawLine(Dpy, DrawingWindow, Output.fgGC, TO_DRAW_X(X + EMARK_SIZE),
383
TO_DRAW_Y(Y), TO_DRAW_X(X), TO_DRAW_Y(Y - EMARK_SIZE));
384
XDrawLine(Dpy, DrawingWindow, Output.fgGC, TO_DRAW_X(X - EMARK_SIZE),
385
TO_DRAW_Y(Y), TO_DRAW_X(X), TO_DRAW_Y(Y + EMARK_SIZE));
386
XDrawLine(Dpy, DrawingWindow, Output.fgGC, TO_DRAW_X(X + EMARK_SIZE),
387
TO_DRAW_Y(Y), TO_DRAW_X(X), TO_DRAW_Y(Y + EMARK_SIZE));
625
DrawEverything (BoxTypePtr drawn_area)
630
* first draw all 'invisible' stuff
632
if (PCB->InvisibleObjectsOn)
634
r_search (PCB->Data->pad_tree, drawn_area, NULL, backPad_callback,
638
r_search (PCB->Data->element_tree, drawn_area, NULL, backE_callback,
640
r_search (PCB->Data->name_tree[NAME_INDEX (PCB)], drawn_area, NULL,
641
backN_callback, NULL);
644
(SWAP_IDENT ? COMPONENT_LAYER : SOLDER_LAYER)),
648
/* draw all layers in layerstack order */
649
for (i = MAX_LAYER - 1; i >= 0; i--)
650
if ((LAYER_ON_STACK (i))->On)
651
DrawLayer (LAYER_ON_STACK (i), drawn_area);
652
/* draw vias below silk */
654
r_search (PCB->Data->via_tree, drawn_area, NULL, lowvia_callback, NULL);
655
/* Draw the solder mask if turned on */
656
if (TEST_FLAG (SHOWMASKFLAG, PCB))
657
DrawMask (drawn_area);
658
/* Draw top silkscreen */
661
DrawLayer (LAYER_PTR (MAX_LAYER + (SWAP_IDENT ? SOLDER_LAYER :
662
COMPONENT_LAYER)), drawn_area);
665
r_search (PCB->Data->element_tree, drawn_area, NULL, frontE_callback,
667
r_search (PCB->Data->name_tree[NAME_INDEX (PCB)], drawn_area, NULL,
668
frontN_callback, NULL);
670
/* Draw pins, pads, vias above silk */
671
DrawTop (drawn_area);
674
r_search (PCB->Data->pin_tree, drawn_area, NULL, hole_callback, NULL);
677
r_search (PCB->Data->via_tree, drawn_area, NULL, hole_callback, NULL);
678
/* Draw element Marks */
680
r_search (PCB->Data->element_tree, drawn_area, NULL, EMark_callback, NULL);
681
/* Draw rat lines on top */
683
r_search (PCB->Data->rat_tree, drawn_area, NULL, rat_callback, NULL);
684
if (Settings.DrawGrid)
689
DrawEMark (LocationType X, LocationType Y, Boolean invisible)
691
if (!PCB->InvisibleObjectsOn && invisible)
693
XSetForeground (Dpy, Output.fgGC,
694
invisible ? PCB->InvisibleMarkColor : PCB->ElementColor);
695
XSetLineAttributes (Dpy, Output.fgGC, 1, LineSolid, CapRound, JoinRound);
696
XDrawCLine (Dpy, DrawingWindow, Output.fgGC, X - EMARK_SIZE,
697
Y, X, Y - EMARK_SIZE);
698
XDrawCLine (Dpy, DrawingWindow, Output.fgGC, X + EMARK_SIZE,
699
Y, X, Y - EMARK_SIZE);
700
XDrawCLine (Dpy, DrawingWindow, Output.fgGC, X - EMARK_SIZE,
701
Y, X, Y + EMARK_SIZE);
702
XDrawCLine (Dpy, DrawingWindow, Output.fgGC, X + EMARK_SIZE,
703
Y, X, Y + EMARK_SIZE);
707
via_callback (const BoxType * b, void *cl)
709
PinTypePtr via = (PinTypePtr) b;
711
DrawPlainVia (via, False);
716
pin_callback (const BoxType * b, void *cl)
718
DrawPlainPin ((PinTypePtr) b, False);
723
pad_callback (const BoxType * b, void *cl)
725
PadTypePtr pad = (PadTypePtr) b;
390
731
/* ---------------------------------------------------------------------------
391
732
* draws pins pads and vias
393
static void DrawTop(void)
395
/* draw element pins */
397
ELEMENT_LOOP(PCB->Data,
398
if (VELEMENT(element))
399
DrawPlainElementPinsAndPads(element, 0);
404
VIA_LOOP(PCB->Data, if (VVIA(via)) DrawPlainVia(via, 0););
735
DrawTop (BoxType * screen)
739
/* draw element pins */
740
r_search (PCB->Data->pin_tree, screen, NULL, pin_callback, NULL);
741
/* draw element pads */
742
r_search (PCB->Data->pad_tree, screen, NULL, pad_callback, NULL);
746
r_search (PCB->Data->via_tree, screen, NULL, via_callback, NULL);
757
clearPin_callback (const BoxType * b, void *cl)
759
PinTypePtr pin = (PinTypePtr) b;
760
struct pin_info *i = (struct pin_info *) cl;
762
ClearOnlyPin (pin, True);
763
else if (TEST_FLAG (i->PIPFlag, pin))
764
ClearOnlyPin (pin, False);
769
clearPad_callback (const BoxType * b, void *cl)
771
PadTypePtr pad = (PadTypePtr) b;
772
if (!XOR (TEST_FLAG (ONSOLDERFLAG, pad), SWAP_IDENT))
773
ClearPad (pad, True);
777
/* ---------------------------------------------------------------------------
778
* draws solder mask layer - this will cover nearly everything
781
DrawMask (BoxType * screen)
783
struct pin_info info;
786
XSetFunction (Dpy, Output.pmGC, GXcopy);
787
/* fill whole map first */
788
XSetForeground (Dpy, Output.pmGC, AllPlanes);
789
XFillRectangle (Dpy, Offmask, Output.pmGC, 0, 0, Output.Width,
791
XSetFillStyle (Dpy, Output.pmGC, FillSolid);
792
/* make clearances in mask */
793
XSetFunction (Dpy, Output.pmGC, GXclear);
794
r_search (PCB->Data->pin_tree, screen, NULL, clearPin_callback, &info);
795
r_search (PCB->Data->via_tree, screen, NULL, clearPin_callback, &info);
796
r_search (PCB->Data->pad_tree, screen, NULL, clearPad_callback, &info);
797
XSetClipMask (Dpy, Output.fgGC, Offmask);
798
/* now draw the mask */
799
XSetForeground (Dpy, Output.fgGC, PCB->MaskColor);
800
XFillRectangle (Dpy, DrawingWindow, Output.fgGC, 0, 0,
801
TO_DRAWABS_X (PCB->MaxWidth),
802
TO_DRAWABS_Y (PCB->MaxHeight));
803
/* restore the clip region */
804
XCopyGC (Dpy, Output.bgGC, GCClipMask, Output.fgGC);
808
clear_callback (int type, void *ptr1, void *ptr2, void *ptr3,
809
LayerTypePtr lay, PolygonTypePtr poly)
811
LineTypePtr l = (LineTypePtr) ptr2;
812
ArcTypePtr a = (ArcTypePtr) ptr2;
824
ClearOnlyPin ((PinTypePtr) ptr2, False);
827
ClearPad ((PadTypePtr) ptr2, False);
830
Message ("Bad clear callback\n");
836
line_callback (const BoxType * b, void *cl)
838
DrawLine ((LayerTypePtr) cl, (LineTypePtr) b, 0);
843
arc_callback (const BoxType * b, void *cl)
845
DrawArc ((LayerTypePtr) cl, (ArcTypePtr) b, 0);
850
text_callback (const BoxType * b, void *cl)
852
DrawRegularText ((LayerTypePtr) cl, (TextTypePtr) b, 0);
857
therm_callback (const BoxType * b, void *cl)
859
PinTypePtr pin = (PinTypePtr) b;
860
struct pin_info *i = (struct pin_info *) cl;
862
if (TEST_FLAGS (i->PIPFlag, pin))
864
ThermPin (i->Layer, pin);
407
871
/* ---------------------------------------------------------------------------
408
872
* draws one layer
410
static void DrawLayer(LayerTypePtr Layer, int unused)
875
DrawLayer (LayerTypePtr Layer, BoxType * screen)
412
int layernum = GetLayerNumber(PCB->Data, Layer);
413
Cardinal group = GetLayerGroupNumberByNumber(layernum);
416
int PIPFlag = L0PIPFLAG << layernum;
877
int layernum = GetLayerNumber (PCB->Data, Layer);
878
Cardinal group = GetLayerGroupNumberByNumber (layernum);
879
struct pin_info info;
881
int PIPFlag = L0PIPFLAG << layernum;
882
info.PIPFlag = PIPFlag;
417
885
/* in order to render polygons with line cut-outs:
418
886
* draw a solid (or stippled) 1-bit pixmap, then erase
419
887
* the clearance areas. Use that as the mask when
420
888
* drawing the actual polygons
422
if (layernum < MAX_LAYER && Layer->PolygonN)
424
XSetFunction(Dpy, Output.pmGC, GXcopy);
425
if (Settings.StipplePolygons)
427
XSetBackground(Dpy, Output.pmGC, 0);
428
XSetStipple(Dpy, Output.pmGC, Stipples[layernum]);
429
XSetFillStyle(Dpy, Output.pmGC, FillOpaqueStippled);
431
/* fill whole map first */
432
XSetForeground(Dpy, Output.pmGC, AllPlanes);
433
XFillRectangle(Dpy, Offmask, Output.pmGC, 0, 0 , Output.Width, Output.Height);
434
if (Settings.StipplePolygons)
435
XSetFillStyle(Dpy, Output.pmGC, FillSolid);
436
/* make clearances around lines, arcs, pins and vias */
437
XSetFunction(Dpy, Output.pmGC, GXclear);
438
for (entry = 0; entry < PCB->LayerGroups.Number[group]; entry++)
440
Cardinal guest = PCB->LayerGroups.Entries[group][entry];
442
if (guest < MAX_LAYER)
444
LayerTypePtr guestLayer = &PCB->Data->Layer[guest];
446
LINE_LOOP(guestLayer,
447
if (TEST_FLAG(CLEARLINEFLAG, line) && VLINE(line))
451
if (TEST_FLAG(CLEARLINEFLAG, arc) && VARC(arc))
456
ALLPIN_LOOP(PCB->Data,
457
if (TEST_FLAG(PIPFlag, pin))
461
if (TEST_FLAG(PIPFlag, via))
464
if (group == GetLayerGroupNumberByNumber(MAX_LAYER + SOLDER_LAYER))
465
ALLPAD_LOOP(PCB->Data,
466
if (TEST_FLAG(ONSOLDERFLAG, pad))
469
if (group == GetLayerGroupNumberByNumber(MAX_LAYER + COMPONENT_LAYER))
470
ALLPAD_LOOP(PCB->Data,
471
if (!TEST_FLAG(ONSOLDERFLAG, pad))
474
XSetClipMask(Dpy, Output.fgGC, Offmask);
478
POLYGON_LOOP(Layer, if (VPOLY(polygon)) DrawPlainPolygon(Layer, polygon));
479
/* restore the clip region */
480
XCopyGC(Dpy, Output.bgGC, GCClipMask, Output.fgGC);
481
if (layernum < MAX_LAYER)
483
PIPFlag = L0THERMFLAG << layernum;
484
ALLPIN_LOOP(PCB->Data,
485
if (TEST_FLAG(PIPFlag, pin))
486
ThermPin(Layer, pin);
489
if (TEST_FLAG(PIPFlag, via))
490
ThermPin(Layer, via);
494
LINE_LOOP(Layer, if (VLINE(line)) DrawLine(Layer, line, unused));
495
ARC_LOOP(Layer, if (VARC(arc)) DrawArc(Layer, arc, unused));
496
TEXT_LOOP(Layer, if (VTEXT(text)) DrawRegularText(Layer, text, unused));
499
/* ---------------------------------------------------------------------------
500
* initializes some zoom dependend information for pins and lines
501
* just to speed up drawing a bit
503
static void InitSpecialPolygon(void)
506
static FloatPolyType p[8] = {{ 0.5, -TAN_22_5_DEGREE_2},
507
{ TAN_22_5_DEGREE_2, -0.5},
508
{-TAN_22_5_DEGREE_2, -0.5},
509
{ -0.5, -TAN_22_5_DEGREE_2},
510
{ -0.5, TAN_22_5_DEGREE_2},
511
{-TAN_22_5_DEGREE_2, 0.5},
512
{ TAN_22_5_DEGREE_2, 0.5},
513
{ 0.5, TAN_22_5_DEGREE_2}};
516
/* loop over maximum number of different sizes */
517
for (i = MAX(MAX_PINORVIASIZE, MAX_LINESIZE); i != -1; i--)
518
for (j = 0; j < 8; j++)
520
Outline[i][j].x = (p[j].X * TO_SCREEN(i));
521
Outline[i][j].y = (p[j].Y * TO_SCREEN(i));
890
if (layernum < MAX_LAYER && Layer->PolygonN)
892
XSetFunction (Dpy, Output.pmGC, GXcopy);
893
if (Settings.StipplePolygons)
895
XSetBackground (Dpy, Output.pmGC, 0);
896
XSetStipple (Dpy, Output.pmGC, Stipples[layernum]);
897
XSetFillStyle (Dpy, Output.pmGC, FillOpaqueStippled);
899
/* fill whole map first */
900
XSetForeground (Dpy, Output.pmGC, AllPlanes);
901
XFillRectangle (Dpy, Offmask, Output.pmGC, 0, 0, Output.Width,
903
if (Settings.StipplePolygons)
904
XSetFillStyle (Dpy, Output.pmGC, FillSolid);
905
/* make clearances around lines, arcs, pins and vias */
906
XSetFunction (Dpy, Output.pmGC, GXclear);
907
PolygonPlows (group, screen, clear_callback);
908
XSetClipMask (Dpy, Output.fgGC, Offmask);
912
/* print the clearing polys */
913
POLYGON_LOOP (Layer);
915
if (VPOLY (polygon) && TEST_FLAG (CLEARPOLYFLAG, polygon))
916
DrawPlainPolygon (Layer, polygon);
919
/* restore the clip region */
920
XCopyGC (Dpy, Output.bgGC, GCClipMask, Output.fgGC);
921
/* print the non-clearing polys */
922
POLYGON_LOOP (Layer);
924
if (VPOLY (polygon) && !TEST_FLAG (CLEARPOLYFLAG, polygon))
925
DrawPlainPolygon (Layer, polygon);
928
if (layernum < MAX_LAYER)
930
PIPFlag = (L0THERMFLAG | L0PIPFLAG) << layernum;
931
info.PIPFlag = PIPFlag;
932
r_search (PCB->Data->pin_tree, screen, NULL, therm_callback, &info);
933
r_search (PCB->Data->via_tree, screen, NULL, therm_callback, &info);
936
if (TEST_FLAG (CHECKPLANESFLAG, PCB))
938
/* draw all visible lines this layer */
939
r_search (Layer->line_tree, screen, NULL, line_callback, Layer);
940
/* draw the layer arcs on screen */
941
r_search (Layer->arc_tree, screen, NULL, arc_callback, Layer);
942
/* draw the layer text on screen */
943
r_search (Layer->text_tree, screen, NULL, text_callback, Layer);
525
946
/* ---------------------------------------------------------------------------
539
static void DrawSpecialPolygon(Drawable d, GC DrawGC,
540
Position X, Position Y, XPoint *PolyPtr)
961
DrawSpecialPolygon (Drawable d, GC DrawGC,
962
LocationType X, LocationType Y, BDimension Thickness)
545
/* add line offset */
546
for (i = 0; i < 8; i++)
964
static FloatPolyType p[8] = { {0.5, -TAN_22_5_DEGREE_2},
965
{TAN_22_5_DEGREE_2, -0.5},
966
{-TAN_22_5_DEGREE_2, -0.5},
967
{-0.5, -TAN_22_5_DEGREE_2},
968
{-0.5, TAN_22_5_DEGREE_2},
969
{-TAN_22_5_DEGREE_2, 0.5},
970
{TAN_22_5_DEGREE_2, 0.5},
971
{0.5, TAN_22_5_DEGREE_2}
973
static Dimension special_size = 0;
974
static XPoint scaled[8];
979
if (TO_SCREEN (Thickness) != special_size)
981
special_size = TO_SCREEN (Thickness);
982
for (i = 0; i < 8; i++)
548
polygon[i].x = X+ PolyPtr[i].x;
549
polygon[i].y = Y+ PolyPtr[i].y;
984
scaled[i].x = p[i].X * special_size;
985
scaled[i].y = p[i].Y * special_size;
551
XFillPolygon(Dpy, d, DrawGC,
552
polygon, ENTRIES(polygon), Convex, CoordModeOrigin);
988
/* add line offset */
989
for (i = 0; i < 8; i++)
991
polygon[i].x = X + scaled[i].x;
992
polygon[i].y = Y + scaled[i].y;
994
if (TEST_FLAG (THINDRAWFLAG, PCB))
996
XSetLineAttributes (Dpy, Output.fgGC, 1,
997
LineSolid, CapRound, JoinRound);
998
polygon[8].x = X + scaled[0].x;
999
polygon[8].y = Y + scaled[0].y;
1000
XDrawLines (Dpy, d, DrawGC, polygon, 9, CoordModeOrigin);
1003
XFillPolygon (Dpy, d, DrawGC, polygon, 8, Convex, CoordModeOrigin);
555
1006
/* ---------------------------------------------------------------------------
556
1007
* lowlevel drawing routine for pins and vias
558
static void DrawPinOrViaLowLevel(PinTypePtr Ptr, Boolean drawHole)
1010
DrawPinOrViaLowLevel (PinTypePtr Ptr, Boolean drawHole)
560
Dimension half = Ptr->Thickness/2;
562
UpdateRect.x = TO_DRAW_X(Ptr->X - half);
563
UpdateRect.y = TO_DRAW_Y(Ptr->Y) -TO_SCREEN(half);
564
UpdateRect.width = UpdateRect.height = TO_SCREEN(Ptr->Thickness);
571
if (drawHole && TEST_FLAG(HOLEFLAG, Ptr))
573
XSetLineAttributes(Dpy, Output.bgGC, TO_SCREEN(Ptr->Thickness),
574
LineSolid, CapRound, JoinRound);
575
XDrawLine(Dpy, DrawingWindow, Output.bgGC, TO_DRAW_X(Ptr->X),
576
TO_DRAW_Y(Ptr->Y), TO_DRAW_X(Ptr->X), TO_DRAW_Y(Ptr->Y));
577
XSetLineAttributes(Dpy, Output.fgGC, 1, LineSolid, CapRound, JoinRound);
578
XDrawArc(Dpy, DrawingWindow, Output.fgGC,
579
TO_DRAW_X(Ptr->X - half),
580
TO_DRAW_Y(Ptr->Y - TO_SCREEN_SIGN_Y(half)),
581
TO_SCREEN(Ptr->Thickness), TO_SCREEN(Ptr->Thickness),
585
if (TEST_FLAG(SQUAREFLAG, Ptr))
587
XFillRectangle(Dpy, DrawingWindow, Output.fgGC,
588
UpdateRect.x, UpdateRect.y,
589
UpdateRect.width, UpdateRect.height);
591
else if (TEST_FLAG(OCTAGONFLAG, Ptr))
593
XSetLineAttributes(Dpy, Output.fgGC,
594
TO_SCREEN((Ptr->Thickness -Ptr->DrillingHole) /2),
595
LineSolid, CapRound, JoinRound);
597
/* transform X11 specific coord system */
598
DrawSpecialPolygon(DrawingWindow, Output.fgGC,
599
TO_DRAW_X(Ptr->X), TO_DRAW_Y(Ptr->Y),
600
&Outline[Ptr->Thickness][0]);
603
{ /* draw a round pin or via */
604
XSetLineAttributes(Dpy, Output.fgGC, TO_SCREEN(Ptr->Thickness),
605
LineSolid, CapRound, JoinRound);
606
XDrawLine(Dpy, DrawingWindow, Output.fgGC, TO_DRAW_X(Ptr->X),
607
TO_DRAW_Y(Ptr->Y), TO_DRAW_X(Ptr->X), TO_DRAW_Y(Ptr->Y));
610
/* and the drilling hole (which is always round */
613
XSetLineAttributes(Dpy, Output.bgGC, TO_SCREEN(Ptr->DrillingHole),
614
LineSolid, CapRound, JoinRound);
615
XDrawLine(Dpy, DrawingWindow, Output.bgGC, TO_DRAW_X(Ptr->X),
616
TO_DRAW_Y(Ptr->Y), TO_DRAW_X(Ptr->X), TO_DRAW_Y(Ptr->Y));
1014
AddPart (Ptr, False);
1018
if (TEST_FLAG (HOLEFLAG, Ptr))
1022
XSetLineAttributes (Dpy, Output.bgGC, TO_SCREEN (Ptr->Thickness),
1023
LineSolid, CapRound, JoinRound);
1024
XDrawCLine (Dpy, DrawingWindow, Output.bgGC, Ptr->X, Ptr->Y,
1026
XSetLineAttributes (Dpy, Output.fgGC, 1, LineSolid, CapRound,
1028
XDrawCArc (Dpy, DrawingWindow, Output.fgGC, Ptr->X, Ptr->Y,
1029
Ptr->Thickness, Ptr->Thickness, 0, 23040);
1033
if (TEST_FLAG (SQUAREFLAG, Ptr))
1035
if (TEST_FLAG (THINDRAWFLAG, PCB))
1037
XSetLineAttributes (Dpy, Output.fgGC, 1,
1038
LineSolid, CapRound, JoinRound);
1039
XDrawRectangle (Dpy, DrawingWindow, Output.fgGC,
1040
TO_DRAW_X (Ptr->X - Ptr->Thickness / 2),
1042
TO_SCREEN_SIGN_Y (Ptr->Thickness / 2)),
1043
TO_SCREEN (Ptr->Thickness),
1044
TO_SCREEN (Ptr->Thickness));
1048
XFillRectangle (Dpy, DrawingWindow, Output.fgGC,
1049
TO_DRAW_X (Ptr->X - Ptr->Thickness / 2),
1051
TO_SCREEN_SIGN_Y (Ptr->Thickness / 2)),
1052
TO_SCREEN (Ptr->Thickness),
1053
TO_SCREEN (Ptr->Thickness));
1056
else if (TEST_FLAG (OCTAGONFLAG, Ptr))
1058
XSetLineAttributes (Dpy, Output.fgGC,
1059
TO_SCREEN ((Ptr->Thickness - Ptr->DrillingHole) /
1060
2), LineSolid, CapRound, JoinRound);
1062
/* transform X11 specific coord system */
1063
DrawSpecialPolygon (DrawingWindow, Output.fgGC,
1064
TO_DRAW_X (Ptr->X), TO_DRAW_Y (Ptr->Y),
1068
{ /* draw a round pin or via */
1069
if (TEST_FLAG (THINDRAWFLAG, PCB))
1071
XSetLineAttributes (Dpy, Output.fgGC, 1,
1072
LineSolid, CapRound, JoinRound);
1073
XDrawCArc (Dpy, DrawingWindow, Output.fgGC, Ptr->X, Ptr->Y,
1074
Ptr->Thickness, Ptr->Thickness, 0, 360 * 64);
1078
XSetLineAttributes (Dpy, Output.fgGC, TO_SCREEN (Ptr->Thickness),
1079
LineSolid, CapRound, JoinRound);
1080
XDrawCLine (Dpy, DrawingWindow, Output.fgGC, Ptr->X, Ptr->Y,
1085
/* and the drilling hole (which is always round */
1088
if (TEST_FLAG (THINDRAWFLAG, PCB))
1090
XSetLineAttributes (Dpy, Output.fgGC, 1,
1091
LineSolid, CapRound, JoinRound);
1092
XDrawCArc (Dpy, DrawingWindow, Output.fgGC,
1093
Ptr->X, Ptr->Y, Ptr->DrillingHole,
1094
Ptr->DrillingHole, 0, 360 * 64);
1098
XSetLineAttributes (Dpy, Output.bgGC, TO_SCREEN (Ptr->DrillingHole),
1099
LineSolid, CapRound, JoinRound);
1100
XDrawCLine (Dpy, DrawingWindow, Output.bgGC, Ptr->X, Ptr->Y,
620
1106
/**************************************************************
621
1107
* draw pin/via hole
623
static void DrawHole(PinTypePtr Ptr)
1110
DrawHole (PinTypePtr Ptr)
625
XSetLineAttributes(Dpy, Output.bgGC, TO_SCREEN(Ptr->DrillingHole),
626
LineSolid, CapRound, JoinRound);
627
XDrawLine(Dpy, DrawingWindow, Output.bgGC, TO_DRAW_X(Ptr->X),
628
TO_DRAW_Y(Ptr->Y), TO_DRAW_X(Ptr->X), TO_DRAW_Y(Ptr->Y));
629
if (TEST_FLAG(HOLEFLAG, Ptr))
1112
if (TEST_FLAG (THINDRAWFLAG, PCB))
1114
if (!TEST_FLAG (HOLEFLAG, Ptr))
631
Dimension half = Ptr->Thickness/2;
633
if (TEST_FLAG(SELECTEDFLAG, Ptr))
634
XSetForeground(Dpy, Output.fgGC, PCB->ViaSelectedColor);
636
XSetForeground(Dpy, Output.fgGC,
637
BlackPixelOfScreen(XtScreen(Output.Output)));
638
XSetLineAttributes(Dpy, Output.fgGC, 1, LineSolid, CapRound, JoinRound);
639
XDrawArc(Dpy, DrawingWindow, Output.fgGC,
640
TO_DRAW_X(Ptr->X - half),
641
TO_DRAW_Y(Ptr->Y - TO_SCREEN_SIGN_Y(half)),
642
TO_SCREEN(Ptr->DrillingHole), TO_SCREEN(Ptr->DrillingHole),
1116
XSetLineAttributes (Dpy, Output.fgGC, 1,
1117
LineSolid, CapRound, JoinRound);
1118
XDrawCArc (Dpy, DrawingWindow, Output.fgGC, Ptr->X, Ptr->Y,
1119
Ptr->DrillingHole, Ptr->DrillingHole, 0, 360 * 64);
1124
XSetLineAttributes (Dpy, Output.bgGC, TO_SCREEN (Ptr->DrillingHole),
1125
LineSolid, CapRound, JoinRound);
1126
XDrawCLine (Dpy, DrawingWindow, Output.bgGC, Ptr->X,
1127
Ptr->Y, Ptr->X, Ptr->Y);
1129
if (TEST_FLAG (HOLEFLAG, Ptr))
1131
if (TEST_FLAG (WARNFLAG, Ptr))
1132
XSetForeground (Dpy, Output.fgGC, PCB->WarnColor);
1133
else if (TEST_FLAG (SELECTEDFLAG, Ptr))
1134
XSetForeground (Dpy, Output.fgGC, PCB->ViaSelectedColor);
1136
XSetForeground (Dpy, Output.fgGC,
1137
BlackPixelOfScreen (XtScreen (Output.Output)));
1138
XSetLineAttributes (Dpy, Output.fgGC, 1, LineSolid, CapRound,
1140
XDrawCArc (Dpy, DrawingWindow, Output.fgGC, Ptr->X, Ptr->Y,
1141
Ptr->DrillingHole, Ptr->DrillingHole, 0, 23040);
647
1145
/*******************************************************************
648
1146
* draw clearance in pixmask arround pins and vias that pierce polygons
650
static void ClearOnlyPin(PinTypePtr Pin)
1149
ClearOnlyPin (PinTypePtr Pin, Boolean mask)
652
Dimension half = (Pin->Thickness + Pin->Clearance)/2;
654
if (TEST_FLAG(HOLEFLAG, Pin))
657
/* Clear the area around the pin */
658
if (TEST_FLAG(SQUAREFLAG, Pin))
660
XFillRectangle(Dpy, Offmask, Output.pmGC,
661
TO_MASK_X(Pin->X - TO_SCREEN_SIGN_X(half)),
662
TO_MASK_Y(Pin->Y - TO_SCREEN_SIGN_Y(half)),
663
TO_SCREEN(Pin->Thickness + Pin->Clearance),
664
TO_SCREEN(Pin->Thickness + Pin->Clearance));
666
else if (TEST_FLAG(OCTAGONFLAG, Pin))
668
XSetLineAttributes(Dpy, Output.pmGC,
669
TO_SCREEN((Pin->Thickness + Pin->Clearance -Pin->DrillingHole) /2),
670
LineSolid, CapRound, JoinRound);
672
/* transform X11 specific coord system */
673
DrawSpecialPolygon(Offmask, Output.pmGC,
674
TO_MASK_X(Pin->X), TO_MASK_Y(Pin->Y),
675
&Outline[Pin->Thickness + Pin->Clearance][0]);
679
XSetLineAttributes(Dpy, Output.pmGC,
680
TO_SCREEN(Pin->Thickness + Pin->Clearance),
681
LineSolid, CapRound, JoinRound);
682
XDrawLine(Dpy, Offmask, Output.pmGC, TO_MASK_X(Pin->X),
683
TO_MASK_Y(Pin->Y), TO_MASK_X(Pin->X), TO_MASK_Y(Pin->Y));
1152
(mask ? Pin->Mask / 2 : (Pin->Thickness + Pin->Clearance) / 2);
1154
if (!mask && TEST_FLAG (HOLEFLAG, Pin))
1157
/* Clear the area around the pin */
1158
if (TEST_FLAG (SQUAREFLAG, Pin))
1160
XFillRectangle (Dpy, Offmask, Output.pmGC,
1161
TO_DRAW_X (Pin->X - TO_SCREEN_SIGN_X (half)),
1162
TO_DRAW_Y (Pin->Y - TO_SCREEN_SIGN_Y (half)),
1163
TO_SCREEN (mask ? Pin->Mask : Pin->Thickness +
1165
TO_SCREEN (mask ? Pin->Mask : Pin->Thickness +
1168
else if (TEST_FLAG (OCTAGONFLAG, Pin))
1170
XSetLineAttributes (Dpy, Output.pmGC,
1171
TO_SCREEN ((Pin->Thickness + Pin->Clearance -
1172
Pin->DrillingHole) / 2), LineSolid,
1173
CapRound, JoinRound);
1175
/* transform X11 specific coord system */
1176
DrawSpecialPolygon (Offmask, Output.pmGC,
1177
TO_DRAW_X (Pin->X), TO_DRAW_Y (Pin->Y),
1178
mask ? Pin->Mask : Pin->Thickness + Pin->Clearance);
1182
XSetLineAttributes (Dpy, Output.pmGC,
1183
TO_SCREEN (mask ? Pin->Mask : Pin->Thickness +
1184
Pin->Clearance), LineSolid, CapRound,
1186
XDrawCLine (Dpy, Offmask, Output.pmGC, Pin->X, Pin->Y, Pin->X, Pin->Y);
687
1190
/**************************************************************************
688
1191
* draw thermals on pin
690
static void ThermPin(LayerTypePtr layer, PinTypePtr Pin)
1194
ThermPin (LayerTypePtr layer, PinTypePtr Pin)
692
Dimension half = (Pin->Thickness + Pin->Clearance)/2;
693
Dimension halfs = (TO_SCREEN(half) * SQRT2OVER2 + 1);
695
if (TEST_FLAG(SELECTEDFLAG | FOUNDFLAG, Pin))
697
if (TEST_FLAG(SELECTEDFLAG, Pin))
698
XSetForeground(Dpy, Output.fgGC, layer->SelectedColor);
700
XSetForeground(Dpy, Output.fgGC, PCB->ConnectedColor);
703
XSetForeground(Dpy, Output.fgGC, layer->Color);
705
XSetLineAttributes(Dpy, Output.fgGC, TO_SCREEN(Pin->Clearance/2),
706
LineSolid, CapRound, JoinRound);
707
if (TEST_FLAG(SQUAREFLAG, Pin))
710
XDrawLine(Dpy, DrawingWindow, Output.fgGC,
711
TO_DRAW_X(Pin->X) - TO_SCREEN(half),
712
TO_DRAW_Y(Pin->Y) - TO_SCREEN(half),
713
TO_DRAW_X(Pin->X) + TO_SCREEN(half),
714
TO_DRAW_Y(Pin->Y) + TO_SCREEN(half));
715
XDrawLine(Dpy, DrawingWindow, Output.fgGC,
716
TO_DRAW_X(Pin->X) - TO_SCREEN(half),
717
TO_DRAW_Y(Pin->Y) + TO_SCREEN(half),
718
TO_DRAW_X(Pin->X) + TO_SCREEN(half),
719
TO_DRAW_Y(Pin->Y) - TO_SCREEN(half));
723
XDrawLine(Dpy, DrawingWindow, Output.fgGC,
724
TO_DRAW_X(Pin->X) - halfs,
725
TO_DRAW_Y(Pin->Y) - halfs,
726
TO_DRAW_X(Pin->X) + halfs,
727
TO_DRAW_Y(Pin->Y) + halfs);
728
XDrawLine(Dpy, DrawingWindow, Output.fgGC,
729
TO_DRAW_X(Pin->X) - halfs,
730
TO_DRAW_Y(Pin->Y) + halfs,
731
TO_DRAW_X(Pin->X) + halfs,
732
TO_DRAW_Y(Pin->Y) - halfs);
1196
BDimension half = (Pin->Thickness + Pin->Clearance) / 2;
1199
if (TEST_FLAG (SELECTEDFLAG | FOUNDFLAG, Pin))
1201
if (TEST_FLAG (SELECTEDFLAG, Pin))
1202
XSetForeground (Dpy, Output.fgGC, layer->SelectedColor);
1204
XSetForeground (Dpy, Output.fgGC, PCB->ConnectedColor);
1207
XSetForeground (Dpy, Output.fgGC, layer->Color);
1209
finger = (Pin->Thickness - Pin->DrillingHole) * PCB->ThermScale;
1210
XSetLineAttributes (Dpy, Output.fgGC,
1211
TEST_FLAG (THINDRAWFLAG, PCB) ? 1 : TO_SCREEN (finger),
1212
LineSolid, CapRound, JoinRound);
1213
if (TEST_FLAG (SQUAREFLAG, Pin))
1216
XDrawCLine (Dpy, DrawingWindow, Output.fgGC,
1217
Pin->X - half, Pin->Y - half, Pin->X + half, Pin->Y + half);
1218
XDrawCLine (Dpy, DrawingWindow, Output.fgGC,
1219
Pin->X - half, Pin->Y + half, Pin->X + half, Pin->Y - half);
1223
BDimension halfs = (half * M_SQRT1_2 + 1);
1225
XDrawCLine (Dpy, DrawingWindow, Output.fgGC,
1226
Pin->X - halfs, Pin->Y - halfs, Pin->X + halfs,
1228
XDrawCLine (Dpy, DrawingWindow, Output.fgGC, Pin->X - halfs,
1229
Pin->Y + halfs, Pin->X + halfs, Pin->Y - halfs);
736
1233
/* ---------------------------------------------------------------------------
737
1234
* lowlevel drawing routine for pins and vias that pierce polygons
739
void ClearPin(PinTypePtr Pin, int Type, int unused)
1237
ClearPin (PinTypePtr Pin, int Type, int unused)
744
Dimension half = (Pin->Thickness + Pin->Clearance)/2;
745
Dimension halfs = (TO_SCREEN(half) * SQRT2OVER2 + 1);
749
UpdateRect.x = TO_DRAW_X(Pin->X) - TO_SCREEN(half);
750
UpdateRect.y = TO_DRAW_Y(Pin->Y) - TO_SCREEN(half);
751
UpdateRect.width = UpdateRect.height = TO_SCREEN(2*half);
755
/* Clear the area around the pin */
756
if (TEST_FLAG(SQUAREFLAG, Pin))
758
XFillRectangle(Dpy, DrawingWindow, Output.bgGC,
759
TO_DRAW_X(Pin->X - TO_SCREEN_SIGN_X(half)),
760
TO_DRAW_Y(Pin->Y - TO_SCREEN_SIGN_Y(half)),
761
TO_SCREEN(Pin->Thickness + Pin->Clearance),
762
TO_SCREEN(Pin->Thickness + Pin->Clearance));
764
else if (TEST_FLAG(OCTAGONFLAG, Pin))
766
XSetLineAttributes(Dpy, Output.bgGC,
767
TO_SCREEN((Pin->Thickness + Pin->Clearance -Pin->DrillingHole) /2),
768
LineSolid, CapRound, JoinRound);
770
/* transform X11 specific coord system */
771
DrawSpecialPolygon(DrawingWindow, Output.bgGC,
772
TO_DRAW_X(Pin->X), TO_DRAW_Y(Pin->Y),
773
&Outline[Pin->Thickness + Pin->Clearance][0]);
777
XSetLineAttributes(Dpy, Output.bgGC,
778
TO_SCREEN(Pin->Thickness + Pin->Clearance),
779
LineSolid, CapRound, JoinRound);
780
XDrawLine(Dpy, DrawingWindow, Output.bgGC, TO_DRAW_X(Pin->X),
781
TO_DRAW_Y(Pin->Y), TO_DRAW_X(Pin->X), TO_DRAW_Y(Pin->Y));
783
/* draw all the thermal(s) */
784
for (i = MAX_LAYER; i; i--)
786
layer = LAYER_ON_STACK(i-1);
789
ThermLayerFlag = L0THERMFLAG << GetLayerNumber(PCB->Data, layer);
790
if (TEST_FLAG(ThermLayerFlag, Pin))
1242
BDimension half = (Pin->Thickness + Pin->Clearance) / 2;
1246
AddPart (Pin, False);
1249
/* Clear the area around the pin */
1250
if (TEST_FLAG (SQUAREFLAG, Pin))
1252
XFillRectangle (Dpy, DrawingWindow, Output.bgGC,
1253
TO_DRAW_X (Pin->X - TO_SCREEN_SIGN_X (half)),
1254
TO_DRAW_Y (Pin->Y - TO_SCREEN_SIGN_Y (half)),
1255
TO_SCREEN (Pin->Thickness + Pin->Clearance),
1256
TO_SCREEN (Pin->Thickness + Pin->Clearance));
1258
else if (TEST_FLAG (OCTAGONFLAG, Pin))
1260
XSetLineAttributes (Dpy, Output.bgGC,
1261
TO_SCREEN ((Pin->Thickness + Pin->Clearance -
1262
Pin->DrillingHole) / 2), LineSolid,
1263
CapRound, JoinRound);
1265
/* transform X11 specific coord system */
1266
DrawSpecialPolygon (DrawingWindow, Output.bgGC,
1267
TO_DRAW_X (Pin->X), TO_DRAW_Y (Pin->Y),
1268
Pin->Thickness + Pin->Clearance);
1272
XSetLineAttributes (Dpy, Output.bgGC,
1273
TO_SCREEN (Pin->Thickness + Pin->Clearance),
1274
LineSolid, CapRound, JoinRound);
1275
XDrawCLine (Dpy, DrawingWindow, Output.bgGC, Pin->X,
1276
Pin->Y, Pin->X, Pin->Y);
1278
/* draw all the thermal(s) */
1279
for (i = MAX_LAYER; i; i--)
1281
layer = LAYER_ON_STACK (i - 1);
1285
(L0THERMFLAG | L0PIPFLAG) << GetLayerNumber (PCB->Data, layer);
1286
if (TEST_FLAGS (ThermLayerFlag, Pin))
1290
if (TEST_FLAG (SELECTEDFLAG | FOUNDFLAG, Pin))
794
if (TEST_FLAG(SELECTEDFLAG | FOUNDFLAG, Pin))
796
if (TEST_FLAG(SELECTEDFLAG, Pin))
797
XSetForeground(Dpy, Output.fgGC, layer->SelectedColor);
799
XSetForeground(Dpy, Output.fgGC, PCB->ConnectedColor);
802
XSetForeground(Dpy, Output.fgGC, layer->Color);
804
if (TEST_FLAG(SQUAREFLAG, Pin))
806
XSetLineAttributes(Dpy, Output.fgGC, TO_SCREEN(Pin->Clearance/2),
807
LineSolid, CapRound, JoinRound);
809
XDrawLine(Dpy, DrawingWindow, Output.fgGC,
810
TO_DRAW_X(Pin->X) - TO_SCREEN(half),
811
TO_DRAW_Y(Pin->Y) - TO_SCREEN(half),
812
TO_DRAW_X(Pin->X) + TO_SCREEN(half),
813
TO_DRAW_Y(Pin->Y) + TO_SCREEN(half));
814
XDrawLine(Dpy, DrawingWindow, Output.fgGC,
815
TO_DRAW_X(Pin->X) - TO_SCREEN(half),
816
TO_DRAW_Y(Pin->Y) + TO_SCREEN(half),
817
TO_DRAW_X(Pin->X) + TO_SCREEN(half),
818
TO_DRAW_Y(Pin->Y) - TO_SCREEN(half));
822
XSetLineAttributes(Dpy, Output.fgGC, TO_SCREEN(Pin->Clearance/2),
823
LineSolid, CapRound, JoinRound);
824
XDrawLine(Dpy, DrawingWindow, Output.fgGC,
825
TO_DRAW_X(Pin->X) - halfs,
826
TO_DRAW_Y(Pin->Y) - halfs,
827
TO_DRAW_X(Pin->X) + halfs,
828
TO_DRAW_Y(Pin->Y) + halfs);
829
XDrawLine(Dpy, DrawingWindow, Output.fgGC,
830
TO_DRAW_X(Pin->X) - halfs,
831
TO_DRAW_Y(Pin->Y) + halfs,
832
TO_DRAW_X(Pin->X) + halfs,
833
TO_DRAW_Y(Pin->Y) - halfs);
1292
if (TEST_FLAG (SELECTEDFLAG, Pin))
1293
XSetForeground (Dpy, Output.fgGC, layer->SelectedColor);
1295
XSetForeground (Dpy, Output.fgGC, PCB->ConnectedColor);
837
if ((!TEST_FLAG(PINFLAG, Pin) && !PCB->ViaOn) || (TEST_FLAG(PINFLAG, Pin) && !PCB->PinOn))
839
/* now draw the pin or via as appropriate */
844
SetPVColor(Pin, Type);
845
DrawPinOrViaLowLevel(Pin, True);
1298
XSetForeground (Dpy, Output.fgGC, layer->Color);
1300
if (TEST_FLAG (SQUAREFLAG, Pin))
1302
XSetLineAttributes (Dpy, Output.fgGC,
1303
TEST_FLAG (THINDRAWFLAG,
1304
PCB) ? 1 : TO_SCREEN (Pin->
1307
LineSolid, CapRound, JoinRound);
1309
XDrawCLine (Dpy, DrawingWindow, Output.fgGC, Pin->X - half,
1310
Pin->Y - half, Pin->X + half, Pin->Y + half);
1311
XDrawCLine (Dpy, DrawingWindow, Output.fgGC, Pin->X - half,
1312
Pin->Y + half, Pin->X + half, Pin->Y - half);
1316
BDimension halfs = (half * M_SQRT1_2 + 1);
1318
XSetLineAttributes (Dpy, Output.fgGC,
1319
TO_SCREEN (Pin->Clearance / 2), LineSolid,
1320
CapRound, JoinRound);
1321
XDrawCLine (Dpy, DrawingWindow, Output.fgGC, Pin->X - halfs,
1322
Pin->Y - halfs, Pin->X + halfs, Pin->Y + halfs);
1323
XDrawCLine (Dpy, DrawingWindow, Output.fgGC, Pin->X - halfs,
1324
Pin->Y + halfs, Pin->X + halfs, Pin->Y - halfs);
1328
if ((!TEST_FLAG (PINFLAG, Pin) && !PCB->ViaOn)
1329
|| (TEST_FLAG (PINFLAG, Pin) && !PCB->PinOn))
1331
/* now draw the pin or via as appropriate */
1336
SetPVColor (Pin, Type);
1337
DrawPinOrViaLowLevel (Pin, True);
1345
/* virtical text handling provided by Martin Devera with fixes by harry eaton */
1347
/* draw vertical text; xywh is bounding, de is text's descend used for
1350
DrawVText (int x, int y, int w, int h, int de, char *str)
1357
if (strlen (str) == 0)
1360
pm = XCreatePixmap (Dpy, DrawingWindow, w, h, 1);
1361
gc = XCreateGC (Dpy, pm, 0, 0);
1363
/* draw into pixmap */
1364
XFillRectangle (Dpy, pm, gc, 0, 0, w, h);
1365
XSetForeground (Dpy, gc, 1);
1366
XSetFont (Dpy, gc, Settings.PinoutFont[ZoomValue]->fid);
1367
XDrawString (Dpy, pm, gc, 0, h - de, str,
1368
MIN (Settings.PinoutNameLength, strlen (str)));
1370
im = XGetImage (Dpy, pm, 0, 0, w, h, 1, XYPixmap);
1372
/* draw Transpose(im) but only dark pixels; TODO: find a faster way */
1373
for (i = 0; i < w; i++)
1374
for (j = 0; j < h; j++)
1375
if (XGetPixel (im, i, j))
1376
XDrawPoint (Dpy, DrawingWindow, Output.fgGC, x + j, y + w - i - 1);
1378
XFreePixmap (Dpy, pm);
853
1382
/* ---------------------------------------------------------------------------
854
1383
* lowlevel drawing routine for pin and via names
856
static void DrawPinOrViaNameLowLevel(PinTypePtr Ptr)
1386
DrawPinOrViaNameLowLevel (PinTypePtr Ptr)
858
int direction, ascent, descent;
863
UpdateRect.x = TO_DRAW_X(Ptr->X -Ptr->Thickness/2 +Settings.PinoutTextOffsetX);
864
UpdateRect.y = TO_DRAW_Y(Ptr->Y -Ptr->Thickness/2 +Settings.PinoutTextOffsetY);
865
XTextExtents(Settings.PinoutFont[MAX(0,PCB->Zoom)], EMPTY(Ptr->Name),
866
MIN(Settings.PinoutNameLength, strlen(EMPTY(Ptr->Name))),
867
&direction, &ascent, &descent, &overall);
868
UpdateRect.x += overall.lbearing;
869
UpdateRect.width = overall.width;
870
UpdateRect.y -= overall.ascent;
871
UpdateRect.height = ascent + descent;
875
UpdateRect.x = TO_DRAW_X(Ptr->X -Ptr->Thickness/2 +Settings.PinoutTextOffsetX);
876
UpdateRect.y = TO_DRAW_Y(Ptr->Y -Ptr->Thickness/2 +Settings.PinoutTextOffsetY);
877
XDrawString(Dpy, DrawingWindow, Output.fgGC,
878
UpdateRect.x, UpdateRect.y, EMPTY(Ptr->Name),
879
MIN(Settings.PinoutNameLength, strlen(EMPTY(Ptr->Name))));
1388
int direction, ascent, descent;
1389
XCharStruct overall;
1393
name = EMPTY (TEST_FLAG (SHOWNUMBERFLAG, PCB) ? Ptr->Number : Ptr->Name);
1394
XTextExtents (Settings.PinoutFont[ZoomValue],
1395
name, MIN (Settings.PinoutNameLength, strlen (name)),
1396
&direction, &ascent, &descent, &overall);
1397
if (TEST_FLAG (EDGE2FLAG, Ptr))
1399
box.X1 = TO_DRAW_X (Ptr->X) - ascent + descent;
1401
TO_DRAW_Y (Ptr->Y + Ptr->Thickness / 2 + Settings.PinoutTextOffsetY)
1407
TO_DRAW_X (Ptr->X + Ptr->Thickness / 2 + Settings.PinoutTextOffsetX);
1408
box.Y1 = TO_DRAW_Y (Ptr->Y) + overall.ascent / 2;
1412
if (!TEST_FLAG (EDGE2FLAG, Ptr))
1414
box.X1 += overall.lbearing;
1415
box.Y1 -= overall.ascent;
1416
box.X2 = box.X1 + overall.width;
1417
box.Y2 = box.Y1 + ascent + descent;
1421
box.X2 = box.X1 + ascent + descent;;
1422
box.Y2 = box.Y1 + overall.width;
1424
AddPart (&box, True);
1427
if (TEST_FLAG (EDGE2FLAG, Ptr))
1428
DrawVText (box.X1, box.Y1, overall.width,
1429
ascent + descent, descent, name);
1431
XDrawString (Dpy, DrawingWindow, Output.fgGC,
1433
name, MIN (Settings.PinoutNameLength, strlen (name)));
882
1437
/* ---------------------------------------------------------------------------
883
1438
* lowlevel drawing routine for pads
885
static void DrawPadLowLevel(PadTypePtr Pad)
1442
DrawPadLowLevel (PadTypePtr Pad)
889
Dimension size = Pad->Thickness + Pad->Clearance;
891
UpdateRect.x = MIN(TO_DRAW_X(Pad->Point1.X), TO_DRAW_X(Pad->Point2.X));
892
UpdateRect.x -= TO_SCREEN(size/2);
893
UpdateRect.y = MIN(TO_DRAW_Y(Pad->Point1.Y), TO_DRAW_Y(Pad->Point2.Y));
894
UpdateRect.y -= TO_SCREEN(size/2);
895
UpdateRect.width = TO_SCREEN(abs(Pad->Point1.X - Pad->Point2.X) + size);
896
UpdateRect.height = TO_SCREEN(abs(Pad->Point1.Y - Pad->Point2.Y) + size);
901
XSetLineAttributes(Dpy, Output.fgGC,
902
TO_SCREEN(Pad->Thickness), LineSolid,
903
TEST_FLAG(SQUAREFLAG, Pad) ? CapProjecting : CapRound,
1446
AddPart (Pad, False);
1450
if (TEST_FLAG (THINDRAWFLAG, PCB))
1452
int x1, y1, x2, y2, t, t2;
1453
t = Pad->Thickness / 2;
1454
t2 = Pad->Thickness - t;
1459
if (x1 > x2 || y1 > y2)
1468
XSetLineAttributes (Dpy, Output.fgGC,
1469
1, LineSolid, CapRound, JoinRound);
1470
if (TEST_FLAG (SQUAREFLAG, Pad))
1476
XDrawCLine (Dpy, DrawingWindow, Output.fgGC, x1, y1, x1, y2);
1477
XDrawCLine (Dpy, DrawingWindow, Output.fgGC, x1, y2, x2, y2);
1478
XDrawCLine (Dpy, DrawingWindow, Output.fgGC, x2, y2, x2, y1);
1479
XDrawCLine (Dpy, DrawingWindow, Output.fgGC, x2, y1, x1, y1);
1483
XDrawCLine (Dpy, DrawingWindow, Output.fgGC, x1 - t, y1, x2 - t,
1485
XDrawCLine (Dpy, DrawingWindow, Output.fgGC, x1 + t2, y1, x2 + t2,
1487
XDrawCArc (Dpy, DrawingWindow, Output.fgGC, x1, y1, Pad->Thickness,
1488
Pad->Thickness, 0, 180 * 64);
1489
XDrawCArc (Dpy, DrawingWindow, Output.fgGC, x2, y2, Pad->Thickness,
1490
Pad->Thickness, 180 * 64, 180 * 64);
1494
XDrawCLine (Dpy, DrawingWindow, Output.fgGC, x1, y1 - t, x2,
1496
XDrawCLine (Dpy, DrawingWindow, Output.fgGC, x1, y1 + t2, x2,
1498
XDrawCArc (Dpy, DrawingWindow, Output.fgGC, x1, y1, Pad->Thickness,
1499
Pad->Thickness, 90 * 64, 180 * 64);
1500
XDrawCArc (Dpy, DrawingWindow, Output.fgGC, x2, y2, Pad->Thickness,
1501
Pad->Thickness, 270 * 64, 180 * 64);
1507
XSetLineAttributes (Dpy, Output.fgGC,
1508
TO_SCREEN (Pad->Thickness), LineSolid,
1509
TEST_FLAG (SQUAREFLAG,
1510
Pad) ? CapProjecting : CapRound,
905
XDrawLine(Dpy, DrawingWindow, Output.fgGC,
906
TO_DRAW_X(Pad->Point1.X), TO_DRAW_Y(Pad->Point1.Y),
907
TO_DRAW_X(Pad->Point2.X), TO_DRAW_Y(Pad->Point2.Y));
1512
XDrawCLine (Dpy, DrawingWindow, Output.fgGC, Pad->Point1.X,
1513
Pad->Point1.Y, Pad->Point2.X, Pad->Point2.Y);
910
1517
/* ---------------------------------------------------------------------------
911
1518
* lowlevel drawing routine for pad names
913
static void DrawPadNameLowLevel(PadTypePtr Pad)
1522
DrawPadNameLowLevel (PadTypePtr Pad)
915
int direction, ascent, descent;
921
UpdateRect.x = TO_DRAW_X((Pad->Point1.X + Pad->Point2.X)/2 + Settings.PinoutTextOffsetX);
922
UpdateRect.y = TO_DRAW_Y((Pad->Point1.Y + Pad->Point2.Y)/2 + Settings.PinoutTextOffsetY);
923
XTextExtents(Settings.PinoutFont[MAX(0,PCB->Zoom)], EMPTY(Pad->Name),
924
MIN(Settings.PinoutNameLength, strlen(EMPTY(Pad->Name))),
925
&direction, &ascent, &descent, &overall);
926
UpdateRect.x += overall.lbearing;
927
UpdateRect.width = overall.width;
928
UpdateRect.y -= overall.ascent;
929
UpdateRect.height = ascent + descent;
934
UpdateRect.x = TO_DRAW_X((Pad->Point1.X + Pad->Point2.X)/2 + Settings.PinoutTextOffsetX);
935
UpdateRect.y = TO_DRAW_Y((Pad->Point1.Y + Pad->Point2.Y)/2 + Settings.PinoutTextOffsetY);
936
XDrawString(Dpy, DrawingWindow, Output.fgGC,
937
UpdateRect.x, UpdateRect.y,
939
MIN(Settings.PinoutNameLength, strlen(EMPTY(Pad->Name))));
1524
int direction, ascent, descent, vert;
1525
XCharStruct overall;
1529
name = EMPTY (TEST_FLAG (SHOWNUMBERFLAG, PCB) ? Pad->Number : Pad->Name);
1531
XTextExtents (Settings.PinoutFont[ZoomValue], name,
1532
MIN (Settings.PinoutNameLength, strlen (name)),
1533
&direction, &ascent, &descent, &overall);
1534
/* should text be vertical ? */
1535
vert = (Pad->Point1.X == Pad->Point2.X);
1538
box.X1 = TO_DRAW_X (Pad->Point1.X) - ascent + descent;
1540
TO_DRAW_Y (MAX (Pad->Point1.Y, Pad->Point2.Y) + Pad->Thickness / 2);
1545
TO_DRAW_X (MAX (Pad->Point1.X, Pad->Point2.X) + Pad->Thickness / 2);
1546
box.Y1 = TO_DRAW_Y (Pad->Point1.Y) + overall.ascent / 2;
1550
box.Y1 += overall.lbearing + TO_SCREEN (Settings.PinoutTextOffsetY);
1552
box.X1 += TO_SCREEN (Settings.PinoutTextOffsetX);
1558
box.X2 = box.X1 + ascent + descent;
1559
box.Y2 = box.Y1 + overall.width;
1563
box.X1 += overall.lbearing;
1565
box.X2 = box.X1 + overall.width;
1566
box.Y2 = box.Y1 + ascent + descent;
1568
AddPart (&box, True);
1573
DrawVText (box.X1, box.Y1, overall.width,
1574
ascent + descent, descent, name);
1576
XDrawString (Dpy, DrawingWindow, Output.fgGC,
1578
name, MIN (Settings.PinoutNameLength, strlen (name)));
942
1581
/* ---------------------------------------------------------------------------
943
1582
* clearance for pads
945
static void ClearPad(PadTypePtr Pad)
1585
ClearPad (PadTypePtr Pad, Boolean mask)
947
XSetLineAttributes(Dpy, Output.pmGC,
948
TO_SCREEN(Pad->Thickness + Pad->Clearance), LineSolid,
949
TEST_FLAG(SQUAREFLAG, Pad) ? CapProjecting : CapRound,
951
XDrawLine(Dpy, Offmask, Output.pmGC,
952
TO_MASK_X(Pad->Point1.X), TO_MASK_Y(Pad->Point1.Y),
953
TO_MASK_X(Pad->Point2.X), TO_MASK_Y(Pad->Point2.Y));
1587
XSetLineAttributes (Dpy, Output.pmGC,
1588
TO_SCREEN (mask ? Pad->Mask : Pad->Thickness +
1589
Pad->Clearance), LineSolid,
1590
TEST_FLAG (SQUAREFLAG, Pad) ? CapProjecting : CapRound,
1592
XDrawCLine (Dpy, Offmask, Output.pmGC, Pad->Point1.X, Pad->Point1.Y,
1593
Pad->Point2.X, Pad->Point2.Y);
956
1596
/* ---------------------------------------------------------------------------
957
1597
* clearance for lines
959
static void ClearLine(LineTypePtr Line)
1600
ClearLine (LineTypePtr Line)
961
XSetLineAttributes(Dpy, Output.pmGC,
962
TO_SCREEN(Line->Clearance + Line->Thickness), LineSolid, CapRound, JoinRound);
963
XDrawLine(Dpy, Offmask, Output.pmGC,
964
TO_MASK_X(Line->Point1.X), TO_MASK_Y(Line->Point1.Y),
965
TO_MASK_X(Line->Point2.X), TO_MASK_Y(Line->Point2.Y));
1602
XSetLineAttributes (Dpy, Output.pmGC,
1603
TO_SCREEN (Line->Clearance + Line->Thickness),
1604
LineSolid, CapRound, JoinRound);
1605
XDrawCLine (Dpy, Offmask, Output.pmGC, Line->Point1.X, Line->Point1.Y,
1606
Line->Point2.X, Line->Point2.Y);
968
1609
/* ---------------------------------------------------------------------------
969
1610
* clearance for arcs
971
static void ClearArc(ArcTypePtr Arc)
1613
ClearArc (ArcTypePtr Arc)
973
XSetLineAttributes(Dpy, Output.pmGC,
974
TO_SCREEN(Arc->Thickness + Arc->Clearance),
975
LineSolid, CapRound, JoinRound);
976
XDrawArc(Dpy, Offmask, Output.pmGC,
977
TO_MASK_X(Arc->X) -TO_SCREEN(Arc->Width),
978
TO_MASK_Y(Arc->Y) -TO_SCREEN(Arc->Height),
979
TO_SCREEN(2*Arc->Width),
980
TO_SCREEN(2*Arc->Height),
981
(TO_SCREEN_ANGLE(Arc->StartAngle) -180) *64,
982
TO_SCREEN_DELTA(Arc->Delta) *64);
1615
XSetLineAttributes (Dpy, Output.pmGC,
1616
TO_SCREEN (Arc->Thickness + Arc->Clearance),
1617
LineSolid, CapRound, JoinRound);
1618
XDrawCArc (Dpy, Offmask, Output.pmGC, Arc->X, Arc->Y,
1619
2 * Arc->Width, 2 * Arc->Height,
1620
(Arc->StartAngle - 180) * 64, Arc->Delta * 64);
985
1623
/* ---------------------------------------------------------------------------
986
1624
* lowlevel drawing routine for lines
988
static void DrawLineLowLevel(LineTypePtr Line, Boolean HaveGathered)
1627
DrawLineLowLevel (LineTypePtr Line, Boolean HaveGathered)
990
if (Gathering && !HaveGathered)
992
Dimension wide = Line->Thickness;
994
if (TEST_FLAG(CLEARLINEFLAG, Line))
995
wide += Line->Clearance;
996
UpdateRect.x = MIN(TO_DRAW_X(Line->Point1.X), TO_DRAW_X(Line->Point2.X));
997
UpdateRect.x -= TO_SCREEN(wide/2);
998
UpdateRect.y = MIN(TO_DRAW_Y(Line->Point1.Y), TO_DRAW_Y(Line->Point2.Y));
999
UpdateRect.y -= TO_SCREEN(wide/2);
1000
UpdateRect.width = TO_SCREEN(abs(Line->Point1.X - Line->Point2.X) + wide);
1001
UpdateRect.height = TO_SCREEN(abs(Line->Point1.Y - Line->Point2.Y) + wide);
1002
if (UpdateRect.width == 0)
1003
UpdateRect.width = 1;
1004
if (UpdateRect.height == 0)
1005
UpdateRect.height = 1;
1010
XSetLineAttributes(Dpy, Output.fgGC,
1011
TO_SCREEN(Line->Thickness), LineSolid, CapRound, JoinRound);
1012
if (TEST_FLAG(RATFLAG, Line))
1014
XSetStipple(Dpy, Output.fgGC, Stipples[0]);
1015
XSetFillStyle(Dpy, Output.fgGC, FillStippled);
1016
XDrawLine(Dpy, DrawingWindow, Output.fgGC,
1017
TO_DRAW_X(Line->Point1.X), TO_DRAW_Y(Line->Point1.Y),
1018
TO_DRAW_X(Line->Point2.X), TO_DRAW_Y(Line->Point2.Y));
1019
XSetFillStyle(Dpy, Output.fgGC, FillSolid);
1022
XDrawLine(Dpy, DrawingWindow, Output.fgGC,
1023
TO_DRAW_X(Line->Point1.X), TO_DRAW_Y(Line->Point1.Y),
1024
TO_DRAW_X(Line->Point2.X), TO_DRAW_Y(Line->Point2.Y));
1629
if (Gathering && !HaveGathered)
1631
AddPart (Line, False);
1635
if (TEST_FLAG (THINDRAWFLAG, PCB))
1636
XSetLineAttributes (Dpy, Output.fgGC, 1, LineSolid, CapRound, JoinRound);
1638
XSetLineAttributes (Dpy, Output.fgGC,
1639
TO_SCREEN (Line->Thickness), LineSolid, CapRound,
1642
if (TEST_FLAG (RATFLAG, Line))
1644
XSetStipple (Dpy, Output.fgGC, Stipples[0]);
1645
XSetFillStyle (Dpy, Output.fgGC, FillStippled);
1646
XDrawCLine (Dpy, DrawingWindow, Output.fgGC,
1647
Line->Point1.X, Line->Point1.Y,
1648
Line->Point2.X, Line->Point2.Y);
1649
XSetFillStyle (Dpy, Output.fgGC, FillSolid);
1652
XDrawCLine (Dpy, DrawingWindow, Output.fgGC,
1653
Line->Point1.X, Line->Point1.Y,
1654
Line->Point2.X, Line->Point2.Y);
1027
1657
/* ---------------------------------------------------------------------------
1028
1658
* lowlevel drawing routine for text objects
1030
static void DrawTextLowLevel(TextTypePtr Text)
1661
DrawTextLowLevel (TextTypePtr Text)
1034
unsigned char *string = (unsigned char *) Text->TextString;
1036
FontTypePtr font = &PCB->Font;
1040
while (string && *string)
1042
/* draw lines if symbol is valid and data is present */
1043
if (*string <= MAX_FONTPOSITION && font->Symbol[*string].Valid)
1045
LineTypePtr line = font->Symbol[*string].Line;
1047
for (n = font->Symbol[*string].LineN; n; n--, line++)
1048
if (line->Thickness > maxthick)
1049
maxthick = line->Thickness;
1053
maxthick *= Text->Scale/100;
1054
UpdateRect.x = MIN(TO_DRAW_X(Text->BoundingBox.X1), TO_DRAW_X(Text->BoundingBox.X2));
1055
UpdateRect.y = MIN(TO_DRAW_Y(Text->BoundingBox.Y1), TO_DRAW_Y(Text->BoundingBox.Y2));
1056
UpdateRect.x -= TO_SCREEN(maxthick);
1057
UpdateRect.y -= TO_SCREEN(maxthick);
1058
UpdateRect.width = TO_SCREEN(abs(Text->BoundingBox.X2 - Text->BoundingBox.X1) + 2 * maxthick);
1059
UpdateRect.height = TO_SCREEN(abs(Text->BoundingBox.Y2 - Text->BoundingBox.Y1) + 2 * maxthick);
1064
while (string && *string)
1066
/* draw lines if symbol is valid and data is present */
1067
if (*string <= MAX_FONTPOSITION && font->Symbol[*string].Valid)
1069
LineTypePtr line = font->Symbol[*string].Line;
1072
for (n = font->Symbol[*string].LineN; n; n--, line++)
1074
/* create one line, scale, move, rotate and swap it */
1076
newline.Point1.X = (newline.Point1.X +x) *Text->Scale /100;
1077
newline.Point1.Y = newline.Point1.Y *Text->Scale /100;
1078
newline.Point2.X = (newline.Point2.X +x) *Text->Scale /100;
1079
newline.Point2.Y = newline.Point2.Y *Text->Scale /100;
1080
newline.Thickness = newline.Thickness *Text->Scale /100;
1081
if (newline.Thickness > maxthick)
1082
maxthick = newline.Thickness;
1084
RotateLineLowLevel(&newline, 0, 0, Text->Direction);
1086
/* the labels of SMD objects on the bottom
1087
* side haven't been swapped yet, only their offset
1089
if (TEST_FLAG(ONSOLDERFLAG, Text))
1091
newline.Point1.X = SWAP_SIGN_X(newline.Point1.X);
1092
newline.Point1.Y = SWAP_SIGN_Y(newline.Point1.Y);
1093
newline.Point2.X = SWAP_SIGN_X(newline.Point2.X);
1094
newline.Point2.Y = SWAP_SIGN_Y(newline.Point2.Y);
1096
/* add offset and draw line */
1097
newline.Point1.X += Text->X;
1098
newline.Point1.Y += Text->Y;
1099
newline.Point2.X += Text->X;
1100
newline.Point2.Y += Text->Y;
1101
DrawLineLowLevel(&newline, True);
1104
/* move on to next cursor position */
1105
x += (font->Symbol[*string].Width +font->Symbol[*string].Delta);
1109
/* the default symbol is a filled box */
1110
BoxType defaultsymbol = PCB->Font.DefaultSymbol;
1111
Position size = (defaultsymbol.X2 -defaultsymbol.X1) *6/5;
1113
defaultsymbol.X1 = (defaultsymbol.X1 +x) *Text->Scale /100;
1114
defaultsymbol.Y1 = defaultsymbol.Y1 *Text->Scale /100;
1115
defaultsymbol.X2 = (defaultsymbol.X2 +x) *Text->Scale /100;
1116
defaultsymbol.Y2 = defaultsymbol.Y2 *Text->Scale /100;
1118
if (TEST_FLAG(ONSOLDERFLAG, Text))
1120
defaultsymbol.X1 = TO_SCREEN_SIGN_X(defaultsymbol.X1);
1121
defaultsymbol.Y1 = TO_SCREEN_SIGN_Y(defaultsymbol.Y1);
1122
defaultsymbol.X2 = TO_SCREEN_SIGN_X(defaultsymbol.X2);
1123
defaultsymbol.Y2 = TO_SCREEN_SIGN_Y(defaultsymbol.Y2);
1125
RotateBoxLowLevel(&defaultsymbol, 0, 0, Text->Direction);
1127
/* add offset and draw box */
1128
defaultsymbol.X1 += Text->X;
1129
defaultsymbol.Y1 += Text->Y;
1130
defaultsymbol.X2 += Text->X;
1131
defaultsymbol.Y2 += Text->Y;
1132
XFillRectangle(Dpy, DrawingWindow, Output.fgGC,
1133
TO_DRAW_X(defaultsymbol.X1),
1134
TO_DRAW_Y(SWAP_IDENT ? defaultsymbol.Y2 : defaultsymbol.Y1),
1135
TO_SCREEN(abs(defaultsymbol.X2 -defaultsymbol.X1)),
1136
TO_SCREEN(abs(defaultsymbol.Y2 -defaultsymbol.Y1)));
1138
/* move on to next cursor position */
1664
unsigned char *string = (unsigned char *) Text->TextString;
1666
FontTypePtr font = &PCB->Font;
1670
AddPart (Text, False);
1674
while (string && *string)
1676
/* draw lines if symbol is valid and data is present */
1677
if (*string <= MAX_FONTPOSITION && font->Symbol[*string].Valid)
1679
LineTypePtr line = font->Symbol[*string].Line;
1682
for (n = font->Symbol[*string].LineN; n; n--, line++)
1684
/* create one line, scale, move, rotate and swap it */
1686
newline.Point1.X = (newline.Point1.X + x) * Text->Scale / 100;
1687
newline.Point1.Y = newline.Point1.Y * Text->Scale / 100;
1688
newline.Point2.X = (newline.Point2.X + x) * Text->Scale / 100;
1689
newline.Point2.Y = newline.Point2.Y * Text->Scale / 100;
1690
newline.Thickness = newline.Thickness * Text->Scale / 200;
1691
if (newline.Thickness < 800)
1692
newline.Thickness = 800;
1694
RotateLineLowLevel (&newline, 0, 0, Text->Direction);
1696
/* the labels of SMD objects on the bottom
1697
* side haven't been swapped yet, only their offset
1699
if (TEST_FLAG (ONSOLDERFLAG, Text))
1701
newline.Point1.X = SWAP_SIGN_X (newline.Point1.X);
1702
newline.Point1.Y = SWAP_SIGN_Y (newline.Point1.Y);
1703
newline.Point2.X = SWAP_SIGN_X (newline.Point2.X);
1704
newline.Point2.Y = SWAP_SIGN_Y (newline.Point2.Y);
1706
/* add offset and draw line */
1707
newline.Point1.X += Text->X;
1708
newline.Point1.Y += Text->Y;
1709
newline.Point2.X += Text->X;
1710
newline.Point2.Y += Text->Y;
1711
DrawLineLowLevel (&newline, True);
1714
/* move on to next cursor position */
1715
x += (font->Symbol[*string].Width + font->Symbol[*string].Delta);
1719
/* the default symbol is a filled box */
1720
BoxType defaultsymbol = PCB->Font.DefaultSymbol;
1721
LocationType size = (defaultsymbol.X2 - defaultsymbol.X1) * 6 / 5;
1723
defaultsymbol.X1 = (defaultsymbol.X1 + x) * Text->Scale / 100;
1724
defaultsymbol.Y1 = defaultsymbol.Y1 * Text->Scale / 100;
1725
defaultsymbol.X2 = (defaultsymbol.X2 + x) * Text->Scale / 100;
1726
defaultsymbol.Y2 = defaultsymbol.Y2 * Text->Scale / 100;
1728
if (TEST_FLAG (ONSOLDERFLAG, Text))
1730
defaultsymbol.X1 = TO_SCREEN_SIGN_X (defaultsymbol.X1);
1731
defaultsymbol.Y1 = TO_SCREEN_SIGN_Y (defaultsymbol.Y1);
1732
defaultsymbol.X2 = TO_SCREEN_SIGN_X (defaultsymbol.X2);
1733
defaultsymbol.Y2 = TO_SCREEN_SIGN_Y (defaultsymbol.Y2);
1735
RotateBoxLowLevel (&defaultsymbol, 0, 0, Text->Direction);
1737
/* add offset and draw box */
1738
defaultsymbol.X1 += Text->X;
1739
defaultsymbol.Y1 += Text->Y;
1740
defaultsymbol.X2 += Text->X;
1741
defaultsymbol.Y2 += Text->Y;
1742
XFillRectangle (Dpy, DrawingWindow, Output.fgGC,
1743
TO_DRAW_X (defaultsymbol.X1),
1744
TO_DRAW_Y (SWAP_IDENT ? defaultsymbol.Y2 :
1747
(defaultsymbol.X2 - defaultsymbol.X1)),
1749
(defaultsymbol.Y2 - defaultsymbol.Y1)));
1751
/* move on to next cursor position */
1145
1758
/* ---------------------------------------------------------------------------
1146
1759
* lowlevel drawing routine for polygons
1148
static void DrawPolygonLowLevel(PolygonTypePtr Polygon, Boolean OnMask)
1762
DrawPolygonLowLevel (PolygonTypePtr Polygon)
1150
static XPoint *data = NULL; /* tmp pointer */
1151
static Cardinal max = 0;
1155
UpdateRect.x = MIN(TO_DRAW_X(Polygon->BoundingBox.X1), TO_DRAW_X(Polygon->BoundingBox.X2));
1156
UpdateRect.y = MIN(TO_DRAW_Y(Polygon->BoundingBox.Y1), TO_DRAW_Y(Polygon->BoundingBox.Y2));
1157
UpdateRect.width = TO_SCREEN(Polygon->BoundingBox.X2 - Polygon->BoundingBox.X1);
1158
UpdateRect.height = TO_SCREEN(Polygon->BoundingBox.Y2 - Polygon->BoundingBox.Y1);
1162
/* allocate memory for data with screen coordinates */
1163
if (Polygon->PointN > max)
1165
max = Polygon->PointN;
1166
data = (XPoint *) MyRealloc(data, max *sizeof(XPoint),
1167
"DrawPolygonLowLevel()");
1170
/* copy data to tmp array and convert it to screen coordinates */
1171
POLYGONPOINT_LOOP(Polygon,
1174
data[n].x = TO_MASK_X(point->X);
1175
data[n].y = TO_MASK_Y(point->Y);
1179
data[n].x = TO_DRAW_X(point->X);
1180
data[n].y = TO_DRAW_Y(point->Y);
1184
XFillPolygon(Dpy, Offmask, Output.pmGC,
1185
data, Polygon->PointN, Complex, CoordModeOrigin);
1187
XFillPolygon(Dpy, DrawingWindow, Output.fgGC,
1188
data, Polygon->PointN, Complex, CoordModeOrigin);
1766
AddPart (Polygon, False);
1769
DrawCPolygon (DrawingWindow, Polygon);
1191
1772
/* ---------------------------------------------------------------------------
1192
1773
* lowlevel routine to element arcs
1194
static void DrawArcLowLevel(ArcTypePtr Arc)
1776
DrawArcLowLevel (ArcTypePtr Arc)
1196
Dimension width = Arc->Thickness;
1780
AddPart (Arc, False);
1783
/* angles have to be converted to X11 notation */
1784
if (TEST_FLAG (THINDRAWFLAG, PCB))
1785
XSetLineAttributes (Dpy, Output.fgGC, 1, LineSolid, CapRound, JoinRound);
1787
XSetLineAttributes (Dpy, Output.fgGC,
1788
TO_SCREEN (Arc->Thickness), LineSolid, CapRound,
1200
if (TEST_FLAG(CLEARLINEFLAG, Arc))
1201
width += Arc->Clearance;
1202
UpdateRect.x = TO_DRAW_X(Arc->X) -TO_SCREEN(Arc->Width + width/2);
1203
UpdateRect.y = TO_DRAW_Y(Arc->Y) -TO_SCREEN(Arc->Height + width/2);
1204
UpdateRect.width = TO_SCREEN(2*Arc->Width + width);
1205
UpdateRect.height = TO_SCREEN(2*Arc->Height + width);
1209
/* angles have to be converted to X11 notation */
1210
XSetLineAttributes(Dpy, Output.fgGC,
1211
TO_SCREEN(Arc->Thickness), LineSolid, CapRound, JoinRound);
1212
XDrawArc(Dpy, DrawingWindow, Output.fgGC,
1213
TO_DRAW_X(Arc->X) -TO_SCREEN(Arc->Width),
1214
TO_DRAW_Y(Arc->Y) -TO_SCREEN(Arc->Height),
1215
TO_SCREEN(2*Arc->Width),
1216
TO_SCREEN(2*Arc->Height),
1217
(TO_SCREEN_ANGLE(Arc->StartAngle) -180) *64,
1218
TO_SCREEN_DELTA(Arc->Delta) *64);
1791
XDrawCArc (Dpy, DrawingWindow, Output.fgGC, Arc->X, Arc->Y, 2 * Arc->Width,
1792
2 * Arc->Height, (Arc->StartAngle - 180) * 64, Arc->Delta * 64);
1221
1795
/* ---------------------------------------------------------------------------
1222
1796
* draws the package of an element
1224
static void DrawElementPackageLowLevel(ElementTypePtr Element, int unused)
1799
DrawElementPackageLowLevel (ElementTypePtr Element, int unused)
1226
/* draw lines, arcs, text and pins */
1227
ELEMENTLINE_LOOP(Element, DrawLineLowLevel(line, False););
1228
ARC_LOOP(Element, DrawArcLowLevel(arc););
1801
/* draw lines, arcs, text and pins */
1802
ELEMENTLINE_LOOP (Element);
1804
DrawLineLowLevel (line, False);
1809
DrawArcLowLevel (arc);
1231
1814
/* ---------------------------------------------------------------------------
1232
1815
* draw a via object
1234
void DrawVia(PinTypePtr Via, int unused)
1818
DrawVia (PinTypePtr Via, int unused)
1237
SetPVColor(Via, VIA_TYPE);
1238
if (!TEST_FLAG(HOLEFLAG, Via) && TEST_FLAG(ALLPIPFLAGS, Via))
1239
ClearPin(Via, VIA_TYPE, 0);
1241
DrawPinOrViaLowLevel(Via, True);
1242
if (!TEST_FLAG(HOLEFLAG, Via) && TEST_FLAG(DISPLAYNAMEFLAG, Via))
1243
DrawPinOrViaNameLowLevel(Via);
1821
SetPVColor (Via, VIA_TYPE);
1822
if (!TEST_FLAG (HOLEFLAG, Via) && TEST_FLAG (ALLPIPFLAGS, Via))
1823
ClearPin (Via, VIA_TYPE, 0);
1825
DrawPinOrViaLowLevel (Via, True);
1826
if (!TEST_FLAG (HOLEFLAG, Via) && TEST_FLAG (DISPLAYNAMEFLAG, Via))
1827
DrawPinOrViaNameLowLevel (Via);
1246
1830
/* ---------------------------------------------------------------------------
1247
1831
* draw a via without dealing with polygon clearance
1249
static void DrawPlainVia(PinTypePtr Via, int unused)
1834
DrawPlainVia (PinTypePtr Via, Boolean holeToo)
1252
SetPVColor(Via, VIA_TYPE);
1253
DrawPinOrViaLowLevel(Via, False);
1254
if (!TEST_FLAG(HOLEFLAG, Via) && TEST_FLAG(DISPLAYNAMEFLAG, Via))
1255
DrawPinOrViaNameLowLevel(Via);
1837
SetPVColor (Via, VIA_TYPE);
1838
DrawPinOrViaLowLevel (Via, holeToo);
1839
if (!TEST_FLAG (HOLEFLAG, Via) && TEST_FLAG (DISPLAYNAMEFLAG, Via))
1840
DrawPinOrViaNameLowLevel (Via);
1258
1843
/* ---------------------------------------------------------------------------
1259
1844
* draws the name of a via
1261
void DrawViaName(PinTypePtr Via, int unused)
1847
DrawViaName (PinTypePtr Via, int unused)
1265
if (TEST_FLAG(SELECTEDFLAG, Via))
1266
XSetForeground(Dpy, Output.fgGC, PCB->ViaSelectedColor);
1268
XSetForeground(Dpy, Output.fgGC, PCB->ViaColor);
1270
DrawPinOrViaNameLowLevel(Via);
1851
if (TEST_FLAG (SELECTEDFLAG, Via))
1852
XSetForeground (Dpy, Output.fgGC, PCB->ViaSelectedColor);
1854
XSetForeground (Dpy, Output.fgGC, PCB->ViaColor);
1856
DrawPinOrViaNameLowLevel (Via);
1273
1859
/* ---------------------------------------------------------------------------
1274
1860
* draw a pin object
1276
void DrawPin(PinTypePtr Pin, int unused)
1863
DrawPin (PinTypePtr Pin, int unused)
1278
if (!TEST_FLAG(HOLEFLAG, Pin) && TEST_FLAG(ALLPIPFLAGS, Pin))
1279
ClearPin(Pin, PIN_TYPE, 0);
1283
SetPVColor(Pin, PIN_TYPE);
1284
DrawPinOrViaLowLevel(Pin, True);
1286
if (!TEST_FLAG(HOLEFLAG, Pin) && TEST_FLAG(DISPLAYNAMEFLAG, Pin))
1287
DrawPinOrViaNameLowLevel(Pin);
1865
if (!TEST_FLAG (HOLEFLAG, Pin) && TEST_FLAG (ALLPIPFLAGS, Pin))
1866
ClearPin (Pin, PIN_TYPE, 0);
1870
SetPVColor (Pin, PIN_TYPE);
1871
DrawPinOrViaLowLevel (Pin, True);
1873
if (!TEST_FLAG (HOLEFLAG, Pin) && TEST_FLAG (DISPLAYNAMEFLAG, Pin))
1874
DrawPinOrViaNameLowLevel (Pin);
1290
1877
/* ---------------------------------------------------------------------------
1291
1878
* draw a pin without clearing around polygons
1293
static void DrawPlainPin(PinTypePtr Pin, int unused)
1881
DrawPlainPin (PinTypePtr Pin, Boolean holeToo)
1296
SetPVColor(Pin, PIN_TYPE);
1297
DrawPinOrViaLowLevel(Pin, False);
1298
if (!TEST_FLAG(HOLEFLAG, Pin) && TEST_FLAG(DISPLAYNAMEFLAG, Pin))
1299
DrawPinOrViaNameLowLevel(Pin);
1884
SetPVColor (Pin, PIN_TYPE);
1885
DrawPinOrViaLowLevel (Pin, holeToo);
1886
if (!TEST_FLAG (HOLEFLAG, Pin) && TEST_FLAG (DISPLAYNAMEFLAG, Pin))
1887
DrawPinOrViaNameLowLevel (Pin);
1302
1890
/* ---------------------------------------------------------------------------
1303
1891
* draws the name of a pin
1305
void DrawPinName(PinTypePtr Pin, int unused)
1894
DrawPinName (PinTypePtr Pin, int unused)
1309
if (TEST_FLAG(SELECTEDFLAG, Pin))
1310
XSetForeground(Dpy, Output.fgGC, PCB->PinSelectedColor);
1312
XSetForeground(Dpy, Output.fgGC, PCB->PinColor);
1314
DrawPinOrViaNameLowLevel(Pin);
1898
if (TEST_FLAG (SELECTEDFLAG, Pin))
1899
XSetForeground (Dpy, Output.fgGC, PCB->PinSelectedColor);
1901
XSetForeground (Dpy, Output.fgGC, PCB->PinColor);
1903
DrawPinOrViaNameLowLevel (Pin);
1317
1906
/* ---------------------------------------------------------------------------
1318
1907
* draw a pad object
1320
void DrawPad(PadTypePtr Pad, int unused)
1910
DrawPad (PadTypePtr Pad, int unused)
1914
if (TEST_FLAG (WARNFLAG | SELECTEDFLAG | FOUNDFLAG, Pad))
1324
if (TEST_FLAG(WARNFLAG | SELECTEDFLAG | FOUNDFLAG, Pad))
1326
if (TEST_FLAG(WARNFLAG, Pad))
1327
XSetForeground(Dpy, Output.fgGC, PCB->WarnColor);
1328
else if (TEST_FLAG(SELECTEDFLAG, Pad))
1329
XSetForeground(Dpy, Output.fgGC, PCB->PinSelectedColor);
1331
XSetForeground(Dpy, Output.fgGC, PCB->ConnectedColor);
1333
else if (FRONT(Pad))
1334
XSetForeground(Dpy, Output.fgGC, PCB->PinColor);
1336
XSetForeground(Dpy, Output.fgGC, PCB->InvisibleObjectsColor);
1916
if (TEST_FLAG (WARNFLAG, Pad))
1917
XSetForeground (Dpy, Output.fgGC, PCB->WarnColor);
1918
else if (TEST_FLAG (SELECTEDFLAG, Pad))
1919
XSetForeground (Dpy, Output.fgGC, PCB->PinSelectedColor);
1921
XSetForeground (Dpy, Output.fgGC, PCB->ConnectedColor);
1338
DrawPadLowLevel(Pad);
1339
if (TEST_FLAG(DISPLAYNAMEFLAG, Pad))
1340
DrawPadNameLowLevel(Pad);
1923
else if (FRONT (Pad))
1924
XSetForeground (Dpy, Output.fgGC, PCB->PinColor);
1926
XSetForeground (Dpy, Output.fgGC, PCB->InvisibleObjectsColor);
1928
DrawPadLowLevel (Pad);
1929
if (TEST_FLAG (DISPLAYNAMEFLAG, Pad))
1930
DrawPadNameLowLevel (Pad);
1343
1933
/* ---------------------------------------------------------------------------
1344
1934
* draws the name of a pad
1346
void DrawPadName(PadTypePtr Pad, int unused)
1937
DrawPadName (PadTypePtr Pad, int unused)
1350
if (TEST_FLAG(SELECTEDFLAG, Pad))
1351
XSetForeground(Dpy, Output.fgGC, PCB->PinSelectedColor);
1352
else if (FRONT(Pad))
1353
XSetForeground(Dpy, Output.fgGC, PCB->PinColor);
1355
XSetForeground(Dpy,Output.fgGC, PCB->InvisibleObjectsColor);
1357
DrawPadNameLowLevel(Pad);
1941
if (TEST_FLAG (SELECTEDFLAG, Pad))
1942
XSetForeground (Dpy, Output.fgGC, PCB->PinSelectedColor);
1943
else if (FRONT (Pad))
1944
XSetForeground (Dpy, Output.fgGC, PCB->PinColor);
1946
XSetForeground (Dpy, Output.fgGC, PCB->InvisibleObjectsColor);
1948
DrawPadNameLowLevel (Pad);
1360
1951
/* ---------------------------------------------------------------------------
1361
1952
* draws a line on a layer
1363
void DrawLine(LayerTypePtr Layer, LineTypePtr Line, int unused)
1955
DrawLine (LayerTypePtr Layer, LineTypePtr Line, int unused)
1959
if (TEST_FLAG (SELECTEDFLAG | FOUNDFLAG, Line))
1367
if (TEST_FLAG(SELECTEDFLAG | FOUNDFLAG, Line))
1369
if (TEST_FLAG(SELECTEDFLAG, Line))
1370
XSetForeground(Dpy, Output.fgGC, Layer->SelectedColor);
1372
XSetForeground(Dpy, Output.fgGC, PCB->ConnectedColor);
1375
XSetForeground(Dpy, Output.fgGC, Layer->Color);
1961
if (TEST_FLAG (SELECTEDFLAG, Line))
1962
XSetForeground (Dpy, Output.fgGC, Layer->SelectedColor);
1964
XSetForeground (Dpy, Output.fgGC, PCB->ConnectedColor);
1377
DrawLineLowLevel(Line, False);
1967
XSetForeground (Dpy, Output.fgGC, Layer->Color);
1969
DrawLineLowLevel (Line, False);
1380
1972
/* ---------------------------------------------------------------------------
1381
1973
* draws a ratline
1383
void DrawRat(RatTypePtr Line, int unused)
1976
DrawRat (RatTypePtr Line, int unused)
1980
if (TEST_FLAG (SELECTEDFLAG | FOUNDFLAG, Line))
1387
if (TEST_FLAG(SELECTEDFLAG | FOUNDFLAG, Line))
1389
if (TEST_FLAG(SELECTEDFLAG, Line))
1390
XSetForeground(Dpy, Output.fgGC, PCB->RatSelectedColor);
1392
XSetForeground(Dpy, Output.fgGC, PCB->ConnectedColor);
1395
XSetForeground(Dpy, Output.fgGC, PCB->RatColor);
1982
if (TEST_FLAG (SELECTEDFLAG, Line))
1983
XSetForeground (Dpy, Output.fgGC, PCB->RatSelectedColor);
1985
XSetForeground (Dpy, Output.fgGC, PCB->ConnectedColor);
1397
DrawLineLowLevel((LineTypePtr) Line, False);
1988
XSetForeground (Dpy, Output.fgGC, PCB->RatColor);
1990
DrawLineLowLevel ((LineTypePtr) Line, False);
1400
1993
/* ---------------------------------------------------------------------------
1401
1994
* draws an arc on a layer
1403
void DrawArc(LayerTypePtr Layer, ArcTypePtr Arc, int unused)
1997
DrawArc (LayerTypePtr Layer, ArcTypePtr Arc, int unused)
2001
if (TEST_FLAG (SELECTEDFLAG | FOUNDFLAG, Arc))
1407
if (TEST_FLAG(SELECTEDFLAG | FOUNDFLAG, Arc))
1409
if (TEST_FLAG(SELECTEDFLAG, Arc))
1410
XSetForeground(Dpy, Output.fgGC, Layer->SelectedColor);
1412
XSetForeground(Dpy, Output.fgGC, PCB->ConnectedColor);
1415
XSetForeground(Dpy, Output.fgGC, Layer->Color);
2003
if (TEST_FLAG (SELECTEDFLAG, Arc))
2004
XSetForeground (Dpy, Output.fgGC, Layer->SelectedColor);
2006
XSetForeground (Dpy, Output.fgGC, PCB->ConnectedColor);
1417
DrawArcLowLevel(Arc);
2009
XSetForeground (Dpy, Output.fgGC, Layer->Color);
2011
DrawArcLowLevel (Arc);
1420
2014
/* ---------------------------------------------------------------------------
1421
2015
* draws a text on a layer
1423
void DrawText(LayerTypePtr Layer, TextTypePtr Text, int unused)
2018
DrawText (LayerTypePtr Layer, TextTypePtr Text, int unused)
1427
if (TEST_FLAG(SELECTEDFLAG, Text))
1428
XSetForeground(Dpy, Output.fgGC, Layer->SelectedColor);
1430
XSetForeground(Dpy, Output.fgGC, Layer->Color);
1431
DrawTextLowLevel(Text);
2022
if (TEST_FLAG (SELECTEDFLAG, Text))
2023
XSetForeground (Dpy, Output.fgGC, Layer->SelectedColor);
2025
XSetForeground (Dpy, Output.fgGC, Layer->Color);
2026
DrawTextLowLevel (Text);
1434
2029
/* ---------------------------------------------------------------------------
1435
2030
* draws text on a layer - assumes it's not on silkscreen
1437
static void DrawRegularText(LayerTypePtr Layer, TextTypePtr Text, int unused)
1439
if (TEST_FLAG(SELECTEDFLAG, Text))
1440
XSetForeground(Dpy, Output.fgGC, Layer->SelectedColor);
1442
XSetForeground(Dpy, Output.fgGC, Layer->Color);
1443
DrawTextLowLevel(Text);
2033
DrawRegularText (LayerTypePtr Layer, TextTypePtr Text, int unused)
2035
if (TEST_FLAG (SELECTEDFLAG, Text))
2036
XSetForeground (Dpy, Output.fgGC, Layer->SelectedColor);
2038
XSetForeground (Dpy, Output.fgGC, Layer->Color);
2039
DrawTextLowLevel (Text);
2043
cp_callback (const BoxType * b, void *cl)
2045
ClearPin ((PinTypePtr) b, (int) cl, 0);
1446
2049
/* ---------------------------------------------------------------------------
1447
2050
* draws a polygon on a layer
1449
void DrawPolygon(LayerTypePtr Layer, PolygonTypePtr Polygon, int unused)
2053
DrawPolygon (LayerTypePtr Layer, PolygonTypePtr Polygon, int unused)
1451
int Myflag, layernum;
1453
if (TEST_FLAG(SELECTEDFLAG | FOUNDFLAG, Polygon))
1455
if (TEST_FLAG(SELECTEDFLAG, Polygon))
1456
XSetForeground(Dpy, Output.fgGC, Layer->SelectedColor);
1458
XSetForeground(Dpy, Output.fgGC, PCB->ConnectedColor);
2057
if (TEST_FLAG (SELECTEDFLAG | FOUNDFLAG, Polygon))
2059
if (TEST_FLAG (SELECTEDFLAG, Polygon))
2060
XSetForeground (Dpy, Output.fgGC, Layer->SelectedColor);
1461
XSetForeground(Dpy, Output.fgGC, Layer->Color);
1462
layernum = GetLayerNumber(PCB->Data, Layer);
1463
if (Settings.StipplePolygons)
1465
XSetStipple(Dpy, Output.fgGC, Stipples[layernum]);
1466
XSetFillStyle(Dpy, Output.fgGC, FillStippled);
1468
DrawPolygonLowLevel(Polygon, False);
1469
if (Settings.StipplePolygons)
1470
XSetFillStyle(Dpy, Output.fgGC, FillSolid);
1471
Myflag = L0THERMFLAG << GetLayerNumber(PCB->Data, Layer);
1472
if (TEST_FLAG(CLEARPOLYFLAG, Polygon))
1474
ALLPIN_LOOP(PCB->Data,
1475
if (IsPointInPolygon(pin->X, pin->Y,
1478
ClearPin(pin, PIN_TYPE, 0);
1482
if (IsPointInPolygon(via->X, via->Y,
1485
ClearPin(via, VIA_TYPE, 0);
2062
XSetForeground (Dpy, Output.fgGC, PCB->ConnectedColor);
2065
XSetForeground (Dpy, Output.fgGC, Layer->Color);
2066
layernum = GetLayerNumber (PCB->Data, Layer);
2067
if (Settings.StipplePolygons)
2069
XSetStipple (Dpy, Output.fgGC, Stipples[layernum]);
2070
XSetFillStyle (Dpy, Output.fgGC, FillStippled);
2072
DrawPolygonLowLevel (Polygon);
2073
if (Settings.StipplePolygons)
2074
XSetFillStyle (Dpy, Output.fgGC, FillSolid);
2075
if (TEST_FLAG (CLEARPOLYFLAG, Polygon))
2077
r_search (PCB->Data->pin_tree, &Polygon->BoundingBox, NULL,
2078
cp_callback, (void *) PIN_TYPE);
2079
r_search (PCB->Data->via_tree, &Polygon->BoundingBox, NULL,
2080
cp_callback, (void *) VIA_TYPE);
1491
2084
/* ---------------------------------------------------------------------------
1492
2085
* draws a polygon without cutting away the pin/via clearances
1494
static void DrawPlainPolygon(LayerTypePtr Layer, PolygonTypePtr Polygon)
1496
if (TEST_FLAG(SELECTEDFLAG | FOUNDFLAG, Polygon))
1498
if (TEST_FLAG(SELECTEDFLAG, Polygon))
1499
XSetForeground(Dpy, Output.fgGC, Layer->SelectedColor);
1501
XSetForeground(Dpy, Output.fgGC, PCB->ConnectedColor);
1504
XSetForeground(Dpy, Output.fgGC, Layer->Color);
1505
DrawPolygonLowLevel(Polygon, False);
2088
DrawPlainPolygon (LayerTypePtr Layer, PolygonTypePtr Polygon)
2090
if (TEST_FLAG (SELECTEDFLAG | FOUNDFLAG, Polygon))
2092
if (TEST_FLAG (SELECTEDFLAG, Polygon))
2093
XSetForeground (Dpy, Output.fgGC, Layer->SelectedColor);
2095
XSetForeground (Dpy, Output.fgGC, PCB->ConnectedColor);
2098
XSetForeground (Dpy, Output.fgGC, Layer->Color);
2099
DrawPolygonLowLevel (Polygon);
1508
2102
/* ---------------------------------------------------------------------------
1509
2103
* draws an element
1511
void DrawElement(ElementTypePtr Element, int unused)
2106
DrawElement (ElementTypePtr Element, int unused)
1513
DrawElementPackage(Element, unused);
1514
DrawElementName(Element, unused);
1515
DrawElementPinsAndPads(Element, unused);
2108
DrawElementPackage (Element, unused);
2109
DrawElementName (Element, unused);
2110
DrawElementPinsAndPads (Element, unused);
1518
2113
/* ---------------------------------------------------------------------------
1519
2114
* draws the name of an element
1521
void DrawElementName(ElementTypePtr Element, int unused)
2117
DrawElementName (ElementTypePtr Element, int unused)
1523
if (TEST_FLAG(HIDENAMEFLAG, Element))
1525
if (TEST_FLAG(SELECTEDFLAG, &ELEMENT_TEXT(PCB, Element)))
1526
XSetForeground(Dpy, Output.fgGC, PCB->ElementSelectedColor);
1529
XSetForeground(Dpy, Output.fgGC, PCB->ElementColor);
1531
XSetForeground(Dpy, Output.fgGC, PCB->InvisibleObjectsColor);
1532
DrawTextLowLevel(&ELEMENT_TEXT(PCB, Element));
2119
if (TEST_FLAG (HIDENAMEFLAG, Element))
2121
if (TEST_FLAG (SELECTEDFLAG, &ELEMENT_TEXT (PCB, Element)))
2122
XSetForeground (Dpy, Output.fgGC, PCB->ElementSelectedColor);
2123
else if (FRONT (Element))
2124
XSetForeground (Dpy, Output.fgGC, PCB->ElementColor);
2126
XSetForeground (Dpy, Output.fgGC, PCB->InvisibleObjectsColor);
2127
DrawTextLowLevel (&ELEMENT_TEXT (PCB, Element));
1535
2130
/* ---------------------------------------------------------------------------
1536
2131
* draws the package of an element
1538
void DrawElementPackage(ElementTypePtr Element, int unused)
2134
DrawElementPackage (ElementTypePtr Element, int unused)
1540
/* set color and draw lines, arcs, text and pins */
1541
if (TEST_FLAG(SELECTEDFLAG, Element))
1542
XSetForeground(Dpy, Output.fgGC, PCB->ElementSelectedColor);
1545
XSetForeground(Dpy, Output.fgGC, PCB->ElementColor);
1547
XSetForeground(Dpy, Output.fgGC, PCB->InvisibleObjectsColor);
1548
DrawElementPackageLowLevel(Element, unused);
2136
/* set color and draw lines, arcs, text and pins */
2137
if (TEST_FLAG (SELECTEDFLAG, Element))
2138
XSetForeground (Dpy, Output.fgGC, PCB->ElementSelectedColor);
2139
else if (FRONT (Element))
2140
XSetForeground (Dpy, Output.fgGC, PCB->ElementColor);
2142
XSetForeground (Dpy, Output.fgGC, PCB->InvisibleObjectsColor);
2143
DrawElementPackageLowLevel (Element, unused);
1551
2146
/* ---------------------------------------------------------------------------
1552
2147
* draw pins of an element
1554
void DrawElementPinsAndPads(ElementTypePtr Element, int unused)
1557
if (FRONT(pad) || PCB->InvisibleObjectsOn)
1558
DrawPad(pad, unused);
1561
DrawPin(pin, unused);
1565
/* ---------------------------------------------------------------------------
1566
* draw pins of an element without clearing around polygons
1568
static void DrawPlainElementPinsAndPads(ElementTypePtr Element, int unused)
1570
/* don't draw invisible pads, they're already handled */
1573
DrawPad(pad, unused);
1576
DrawPlainPin(pin, unused);
2150
DrawElementPinsAndPads (ElementTypePtr Element, int unused)
2154
if (FRONT (pad) || PCB->InvisibleObjectsOn)
2155
DrawPad (pad, unused);
2160
DrawPin (pin, unused);
1580
2165
/* ---------------------------------------------------------------------------
1583
void EraseVia(PinTypePtr Via)
2169
EraseVia (PinTypePtr Via)
1586
if (TEST_FLAG(ALLPIPFLAGS, Via))
1587
ClearPin(Via, NO_TYPE, 0);
1588
XSetForeground(Dpy, Output.fgGC, Settings.bgColor);
1589
DrawPinOrViaLowLevel(Via, False);
1590
if (TEST_FLAG(DISPLAYNAMEFLAG, Via))
1591
DrawPinOrViaNameLowLevel(Via);
2172
if (TEST_FLAG (ALLPIPFLAGS, Via))
2173
ClearPin (Via, NO_TYPE, 0);
2174
XSetForeground (Dpy, Output.fgGC, Settings.bgColor);
2175
DrawPinOrViaLowLevel (Via, False);
2176
if (TEST_FLAG (DISPLAYNAMEFLAG, Via))
2177
DrawPinOrViaNameLowLevel (Via);
1595
2181
/* ---------------------------------------------------------------------------
1596
2182
* erase a ratline
1598
void EraseRat(RatTypePtr Rat)
2185
EraseRat (RatTypePtr Rat)
1601
XSetForeground(Dpy, Output.fgGC, Settings.bgColor);
1602
DrawLineLowLevel((LineTypePtr) Rat, False);
2188
XSetForeground (Dpy, Output.fgGC, Settings.bgColor);
2189
DrawLineLowLevel ((LineTypePtr) Rat, False);
1607
2194
/* ---------------------------------------------------------------------------
1608
2195
* erase a via name
1610
void EraseViaName(PinTypePtr Via)
2198
EraseViaName (PinTypePtr Via)
1613
XSetForeground(Dpy, Output.fgGC, Settings.bgColor);
1614
DrawPinOrViaNameLowLevel(Via);
2201
XSetForeground (Dpy, Output.fgGC, Settings.bgColor);
2202
DrawPinOrViaNameLowLevel (Via);
1618
2206
/* ---------------------------------------------------------------------------
1619
2207
* erase a pad object
1621
void ErasePad(PadTypePtr Pad)
2210
ErasePad (PadTypePtr Pad)
1624
XSetForeground(Dpy, Output.fgGC, Settings.bgColor);
1625
DrawPadLowLevel(Pad);
1626
if (TEST_FLAG(DISPLAYNAMEFLAG, Pad))
1627
DrawPadNameLowLevel(Pad);
2213
XSetForeground (Dpy, Output.fgGC, Settings.bgColor);
2214
DrawPadLowLevel (Pad);
2215
if (TEST_FLAG (DISPLAYNAMEFLAG, Pad))
2216
DrawPadNameLowLevel (Pad);
1631
2220
/* ---------------------------------------------------------------------------
1632
2221
* erase a pad name
1634
void ErasePadName(PadTypePtr Pad)
2224
ErasePadName (PadTypePtr Pad)
1637
XSetForeground(Dpy, Output.fgGC, Settings.bgColor);
1638
DrawPadNameLowLevel(Pad);
2227
XSetForeground (Dpy, Output.fgGC, Settings.bgColor);
2228
DrawPadNameLowLevel (Pad);
1642
2232
/* ---------------------------------------------------------------------------
1643
2233
* erase a pin object
1645
void ErasePin(PinTypePtr Pin)
2236
ErasePin (PinTypePtr Pin)
1648
if (TEST_FLAG(ALLPIPFLAGS, Pin))
1649
ClearPin(Pin, NO_TYPE, 0);
1650
XSetForeground(Dpy, Output.fgGC, Settings.bgColor);
1651
DrawPinOrViaLowLevel(Pin, False);
1652
if (TEST_FLAG(DISPLAYNAMEFLAG, Pin))
1653
DrawPinOrViaNameLowLevel(Pin);
2239
if (TEST_FLAG (ALLPIPFLAGS, Pin))
2240
ClearPin (Pin, NO_TYPE, 0);
2241
XSetForeground (Dpy, Output.fgGC, Settings.bgColor);
2242
DrawPinOrViaLowLevel (Pin, False);
2243
if (TEST_FLAG (DISPLAYNAMEFLAG, Pin))
2244
DrawPinOrViaNameLowLevel (Pin);
1657
2248
/* ---------------------------------------------------------------------------
1658
2249
* erase a pin name
1660
void ErasePinName(PinTypePtr Pin)
2252
ErasePinName (PinTypePtr Pin)
1663
XSetForeground(Dpy, Output.fgGC, Settings.bgColor);
1664
DrawPinOrViaNameLowLevel(Pin);
2255
XSetForeground (Dpy, Output.fgGC, Settings.bgColor);
2256
DrawPinOrViaNameLowLevel (Pin);
1668
2260
/* ---------------------------------------------------------------------------
1669
2261
* erases a line on a layer
1671
void EraseLine(LineTypePtr Line)
2264
EraseLine (LineTypePtr Line)
1674
XSetForeground(Dpy, Output.fgGC, Settings.bgColor);
1675
DrawLineLowLevel(Line, False);
2267
XSetForeground (Dpy, Output.fgGC, Settings.bgColor);
2268
DrawLineLowLevel (Line, False);
1679
2272
/* ---------------------------------------------------------------------------
1680
2273
* erases an arc on a layer
1682
void EraseArc(ArcTypePtr Arc)
2276
EraseArc (ArcTypePtr Arc)
1685
XSetForeground(Dpy, Output.fgGC, Settings.bgColor);
1686
DrawArcLowLevel(Arc);
2279
XSetForeground (Dpy, Output.fgGC, Settings.bgColor);
2280
DrawArcLowLevel (Arc);
1690
2284
/* ---------------------------------------------------------------------------
1691
2285
* erases a text on a layer
1693
void EraseText(TextTypePtr Text)
2288
EraseText (TextTypePtr Text)
1696
XSetForeground(Dpy, Output.fgGC, Settings.bgColor);
1697
DrawTextLowLevel(Text);
2291
XSetForeground (Dpy, Output.fgGC, Settings.bgColor);
2292
DrawTextLowLevel (Text);
1701
2296
/* ---------------------------------------------------------------------------
1702
2297
* erases a polygon on a layer
1704
void ErasePolygon(PolygonTypePtr Polygon)
2300
ErasePolygon (PolygonTypePtr Polygon)
1707
XSetForeground(Dpy, Output.fgGC, Settings.bgColor);
1708
DrawPolygonLowLevel(Polygon, False);
2303
XSetForeground (Dpy, Output.fgGC, Settings.bgColor);
2304
DrawPolygonLowLevel (Polygon);
1712
2308
/* ---------------------------------------------------------------------------
1713
2309
* erases an element
1715
void EraseElement(ElementTypePtr Element)
2312
EraseElement (ElementTypePtr Element)
1718
/* set color and draw lines, arcs, text and pins */
1719
XSetForeground(Dpy, Output.fgGC, Settings.bgColor);
1720
ELEMENTLINE_LOOP(Element, DrawLineLowLevel(line, False););
1721
ARC_LOOP(Element, DrawArcLowLevel(arc););
1722
if (!TEST_FLAG(HIDENAMEFLAG, Element))
1723
DrawTextLowLevel(&ELEMENT_TEXT(PCB, Element));
1724
EraseElementPinsAndPads(Element);
2315
/* set color and draw lines, arcs, text and pins */
2316
XSetForeground (Dpy, Output.fgGC, Settings.bgColor);
2317
ELEMENTLINE_LOOP (Element);
2319
DrawLineLowLevel (line, False);
2324
DrawArcLowLevel (arc);
2327
if (!TEST_FLAG (HIDENAMEFLAG, Element))
2328
DrawTextLowLevel (&ELEMENT_TEXT (PCB, Element));
2329
EraseElementPinsAndPads (Element);
1728
2333
/* ---------------------------------------------------------------------------
1729
2334
* erases all pins and pads of an element
1731
void EraseElementPinsAndPads(ElementTypePtr Element)
2337
EraseElementPinsAndPads (ElementTypePtr Element)
1734
XSetForeground(Dpy, Output.fgGC, Settings.bgColor);
1736
if (TEST_FLAG(ALLPIPFLAGS, pin))
1738
ClearPin(pin, NO_TYPE, 0);
1739
XSetForeground(Dpy, Output.fgGC, Settings.bgColor);
1741
DrawPinOrViaLowLevel(pin, False);
1742
if (TEST_FLAG(DISPLAYNAMEFLAG, pin))
1743
DrawPinOrViaNameLowLevel(pin);
1746
DrawPadLowLevel(pad);
1747
if (TEST_FLAG(DISPLAYNAMEFLAG, pad))
1748
DrawPadNameLowLevel(pad);
2340
XSetForeground (Dpy, Output.fgGC, Settings.bgColor);
2343
if (TEST_FLAG (ALLPIPFLAGS, pin))
2345
ClearPin (pin, NO_TYPE, 0);
2346
XSetForeground (Dpy, Output.fgGC, Settings.bgColor);
2348
DrawPinOrViaLowLevel (pin, False);
2349
if (TEST_FLAG (DISPLAYNAMEFLAG, pin))
2350
DrawPinOrViaNameLowLevel (pin);
2355
DrawPadLowLevel (pad);
2356
if (TEST_FLAG (DISPLAYNAMEFLAG, pad))
2357
DrawPadNameLowLevel (pad);
1753
2363
/* ---------------------------------------------------------------------------
1754
2364
* erases the name of an element
1756
void EraseElementName(ElementTypePtr Element)
2367
EraseElementName (ElementTypePtr Element)
1758
if (TEST_FLAG(HIDENAMEFLAG, Element))
1761
XSetForeground(Dpy, Output.fgGC, Settings.bgColor);
1762
DrawTextLowLevel(&ELEMENT_TEXT(PCB, Element));
2369
if (TEST_FLAG (HIDENAMEFLAG, Element))
2372
XSetForeground (Dpy, Output.fgGC, Settings.bgColor);
2373
DrawTextLowLevel (&ELEMENT_TEXT (PCB, Element));
1766
2377
/* ---------------------------------------------------------------------------
1767
2378
* draws grid points if the distance is >= MIN_GRID_DISTANCE
1769
static void DrawGrid()
1771
Position minx, miny,
1776
delta = GetGridFactor() *PCB->Grid;
1777
if (TO_SCREEN(delta) >= MIN_GRID_DISTANCE)
1781
maxx = TO_PCB_X(Output.Width);
1782
maxy = TO_PCB_Y(Output.Height);
1793
maxx = MIN((Dimension) maxx, PCB->MaxWidth);
1794
maxy = MIN((Dimension) maxy, PCB->MaxHeight);
1795
miny = MAX(0, miny);
1796
for (y = miny; y <= maxy; y += delta)
1797
for (x = minx; x <= maxx; x += delta)
1798
XDrawPoint(Dpy, DrawingWindow,
1799
Output.GridGC, TO_DRAW_X(GRIDFIT_X(x, delta)),
1800
TO_DRAW_Y(GRIDFIT_Y(y, delta)));
1804
void EraseObject(int type, void *ptr)
1810
ErasePin((PinTypePtr) ptr);
1813
case ELEMENTNAME_TYPE:
1814
EraseText((TextTypePtr) ptr);
1817
ErasePolygon((PolygonTypePtr) ptr);
1820
EraseElement((ElementTypePtr) ptr);
1824
EraseLine((LineTypePtr) ptr);
1827
ErasePad((PadTypePtr) ptr);
1830
EraseArc((ArcTypePtr) ptr);
1833
Message("hace: Internal ERROR, trying to erase an unknown type\n");
1839
void DrawObject(int type, void *ptr1, void *ptr2, int unused)
1845
DrawVia((PinTypePtr) ptr2, 0);
1848
if (((LayerTypePtr) ptr1)->On)
1849
DrawLine((LayerTypePtr) ptr1, (LineTypePtr) ptr2, 0);
1852
if (((LayerTypePtr) ptr1)->On)
1853
DrawArc((LayerTypePtr) ptr1, (ArcTypePtr) ptr2, 0);
1856
if (((LayerTypePtr) ptr1)->On)
1857
DrawText((LayerTypePtr) ptr1, (TextTypePtr) ptr2, 0);
1860
if (((LayerTypePtr) ptr1)->On)
1861
DrawPolygon((LayerTypePtr) ptr1, (PolygonTypePtr) ptr2, 0);
1864
if (PCB->ElementOn &&
1865
(FRONT((ElementTypePtr) ptr2) || PCB->InvisibleObjectsOn))
1866
DrawElement((ElementTypePtr) ptr2, 0);
1870
DrawRat((RatTypePtr) ptr2, 0);
1874
DrawPin((PinTypePtr) ptr2, 0);
1878
DrawPad((PadTypePtr) ptr2, 0);
1880
case ELEMENTNAME_TYPE:
1881
if (PCB->ElementOn &&
1882
(FRONT((ElementTypePtr) ptr2) || PCB->InvisibleObjectsOn))
1883
DrawElementName((ElementTypePtr) ptr1, 0);
2383
LocationType minx, miny, maxx, maxy, temp;
2386
delta = GetGridFactor () * PCB->Grid;
2387
if (TO_SCREEN ((int) delta) >= MIN_GRID_DISTANCE)
2389
minx = TO_PCB_X (0);
2390
miny = TO_PCB_Y (0);
2391
maxx = TO_PCB_X (Output.Width);
2392
maxy = TO_PCB_Y (Output.Height);
2408
maxx = MIN ((BDimension) maxx, PCB->MaxWidth);
2409
maxy = MIN ((BDimension) maxy, PCB->MaxHeight);
2410
miny = MAX (0, miny);
2411
minx = MAX (0, minx);
2412
for (y = miny; y <= maxy; y += delta)
2413
for (x = minx; x <= maxx; x += delta)
2414
XDrawPoint (Dpy, DrawingWindow,
2415
Output.GridGC, TO_DRAW_X (GRIDFIT_X (x, delta)),
2416
TO_DRAW_Y (GRIDFIT_Y (y, delta)));
2421
EraseObject (int type, void *ptr)
2427
ErasePin ((PinTypePtr) ptr);
2430
case ELEMENTNAME_TYPE:
2431
EraseText ((TextTypePtr) ptr);
2434
ErasePolygon ((PolygonTypePtr) ptr);
2437
EraseElement ((ElementTypePtr) ptr);
2440
case ELEMENTLINE_TYPE:
2442
EraseLine ((LineTypePtr) ptr);
2445
ErasePad ((PadTypePtr) ptr);
2448
case ELEMENTARC_TYPE:
2449
EraseArc ((ArcTypePtr) ptr);
2452
Message ("hace: Internal ERROR, trying to erase an unknown type\n");
2459
DrawObject (int type, void *ptr1, void *ptr2, int unused)
2465
DrawVia ((PinTypePtr) ptr2, 0);
2468
if (((LayerTypePtr) ptr1)->On)
2469
DrawLine ((LayerTypePtr) ptr1, (LineTypePtr) ptr2, 0);
2472
if (((LayerTypePtr) ptr1)->On)
2473
DrawArc ((LayerTypePtr) ptr1, (ArcTypePtr) ptr2, 0);
2476
if (((LayerTypePtr) ptr1)->On)
2477
DrawText ((LayerTypePtr) ptr1, (TextTypePtr) ptr2, 0);
2480
if (((LayerTypePtr) ptr1)->On)
2481
DrawPolygon ((LayerTypePtr) ptr1, (PolygonTypePtr) ptr2, 0);
2484
if (PCB->ElementOn &&
2485
(FRONT ((ElementTypePtr) ptr2) || PCB->InvisibleObjectsOn))
2486
DrawElement ((ElementTypePtr) ptr2, 0);
2490
DrawRat ((RatTypePtr) ptr2, 0);
2494
DrawPin ((PinTypePtr) ptr2, 0);
2498
DrawPad ((PadTypePtr) ptr2, 0);
2500
case ELEMENTNAME_TYPE:
2501
if (PCB->ElementOn &&
2502
(FRONT ((ElementTypePtr) ptr2) || PCB->InvisibleObjectsOn))
2503
DrawElementName ((ElementTypePtr) ptr1, 0);